In [1]:
%matplotlib inline

In [2]:
import os, sys
sys.path.append(os.path.abspath('../../main/python'))

import datetime as dt

import numpy as np
import numpy.testing as npt
import matplotlib.pyplot as plt

from thalesians.tsa.distrs import NormalDistr as N
import thalesians.tsa.filtering as filtering
import thalesians.tsa.filtering.kalman as kalman
import thalesians.tsa.filtering.lineargaussian as lineargaussian
import thalesians.tsa.filtering.particle as particle
import thalesians.tsa.filtering.visual as visual
import thalesians.tsa.numpyutils as npu
import thalesians.tsa.processes as proc
import thalesians.tsa.randomness as rnd
import thalesians.tsa.simulation as sim

In [3]:
X = proc.GeometricBrownianMotion()
x0 = .3

In [4]:
rnd.random_state(np.random.RandomState(seed=42), force=True)
em = sim.EulerMaruyama(process=X, initial_value=x0, times=sim.xtimes(start=0., stop=1., step=1E-3))
df = sim.run(em)
plt.plot(df);



In [5]:
t0 = 0.
kf = filtering.kalman.KalmanFilter(t0, state_distr=N(mean=x0, cov=2.5), process=X, approximate_distr=True)

In [6]:
observable = kf.create_observable(lineargaussian.LinearGaussianObsModel.create(1.), X)

In [7]:
run_df = filtering.run(observable=observable, obss=0, df=df, return_df=True)

In [8]:
run_df.df


Out[8]:
time filter_name filter_type observable_name accepted obs_mean obs_cov predicted_obs_mean predicted_obs_cov cross_cov innov_mean innov_cov prior_state_mean prior_state_cov posterior_state_mean posterior_state_cov true_value log_likelihood gain
0 0.000 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... None None NaN NaN NaN NaN NaN NaN NaN 0.300000 2.500000 0.300000 2.500000 None NaN None
1 0.000 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.300000 0.0 0.300000 2.500000 2.500000 0.000000 2.500000 0.300000 2.500000 0.300000 2.500000 None -1.377084 [[1.0]]
2 0.001 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.304712 0.0 0.300000 0.000090 0.000090 0.004712 0.000090 0.300000 0.000090 0.300000 0.000090 None 3.615361 [[1.0]]
3 0.002 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.303380 0.0 0.304712 0.000093 0.000093 -0.001332 0.000093 0.304712 0.000093 0.304712 0.000093 None 3.713523 [[1.0]]
4 0.003 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.309594 0.0 0.303380 0.000092 0.000092 0.006214 0.000092 0.303380 0.000092 0.303380 0.000092 None 3.517813 [[0.9999999999999999]]
5 0.004 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.324504 0.0 0.309594 0.000096 0.000096 0.014911 0.000096 0.309594 0.000096 0.309594 0.000096 None 2.547953 [[1.0]]
6 0.005 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.322102 0.0 0.324504 0.000105 0.000105 -0.002403 0.000105 0.324504 0.000105 0.324504 0.000105 None 3.632745 [[1.0]]
7 0.006 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.319717 0.0 0.322102 0.000104 0.000104 -0.002385 0.000104 0.322102 0.000104 0.322102 0.000104 None 3.640181 [[1.0]]
8 0.007 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.335683 0.0 0.319717 0.000102 0.000102 0.015966 0.000102 0.319717 0.000102 0.319717 0.000102 None 2.428676 [[1.0]]
9 0.008 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.343830 0.0 0.335683 0.000113 0.000113 0.008146 0.000113 0.335683 0.000113 0.335683 0.000113 None 3.331946 [[0.9999999999999999]]
10 0.009 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.338725 0.0 0.343830 0.000118 0.000118 -0.005105 0.000118 0.343830 0.000118 0.343830 0.000118 None 3.492150 [[1.0]]
11 0.010 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.344537 0.0 0.338725 0.000115 0.000115 0.005812 0.000115 0.338725 0.000115 0.338725 0.000115 None 3.470143 [[1.0]]
12 0.011 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.339488 0.0 0.344537 0.000119 0.000119 -0.005049 0.000119 0.344537 0.000119 0.344537 0.000119 None 3.492919 [[1.0]]
13 0.012 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.334488 0.0 0.339488 0.000115 0.000115 -0.005000 0.000115 0.339488 0.000115 0.339488 0.000115 None 3.506609 [[1.0]]
14 0.013 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.337047 0.0 0.334488 0.000112 0.000112 0.002559 0.000112 0.334488 0.000112 0.334488 0.000112 None 3.600586 [[1.0]]
15 0.014 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.316655 0.0 0.337047 0.000114 0.000114 -0.020392 0.000114 0.337047 0.000114 0.337047 0.000114 None 1.792816 [[1.0]]
16 0.015 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.299382 0.0 0.316655 0.000100 0.000100 -0.017272 0.000100 0.316655 0.000100 0.316655 0.000100 None 2.197705 [[0.9999999999999999]]
17 0.016 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.294059 0.0 0.299382 0.000090 0.000090 -0.005323 0.000090 0.299382 0.000090 0.299382 0.000090 None 3.582719 [[1.0]]
18 0.017 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.284641 0.0 0.294059 0.000087 0.000087 -0.009418 0.000087 0.294059 0.000087 0.294059 0.000087 None 3.246007 [[1.0]]
19 0.018 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.287469 0.0 0.284641 0.000081 0.000081 0.002829 0.000081 0.284641 0.000081 0.284641 0.000081 None 3.741866 [[1.0]]
20 0.019 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.279215 0.0 0.287469 0.000083 0.000083 -0.008254 0.000083 0.287469 0.000083 0.287469 0.000083 None 3.369281 [[1.0]]
21 0.020 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.266745 0.0 0.279215 0.000078 0.000078 -0.012470 0.000078 0.279215 0.000078 0.279215 0.000078 None 2.813661 [[1.0]]
22 0.021 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.279108 0.0 0.266745 0.000071 0.000071 0.012363 0.000071 0.266745 0.000071 0.266745 0.000071 None 2.782626 [[1.0]]
23 0.022 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.277115 0.0 0.279108 0.000078 0.000078 -0.001993 0.000078 0.279108 0.000078 0.279108 0.000078 None 3.785371 [[1.0]]
24 0.023 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.277707 0.0 0.277115 0.000077 0.000077 0.000592 0.000077 0.277115 0.000077 0.277115 0.000077 None 3.815733 [[1.0]]
25 0.024 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.265195 0.0 0.277707 0.000077 0.000077 -0.012512 0.000077 0.277707 0.000077 0.277707 0.000077 None 2.801432 [[1.0]]
26 0.025 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.260630 0.0 0.265195 0.000070 0.000070 -0.004565 0.000070 0.265195 0.000070 0.265195 0.000070 None 3.713877 [[1.0]]
27 0.026 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.261544 0.0 0.260630 0.000068 0.000068 0.000914 0.000068 0.260630 0.000068 0.260630 0.000068 None 3.873195 [[1.0]]
28 0.027 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.252024 0.0 0.261544 0.000068 0.000068 -0.009520 0.000068 0.261544 0.000068 0.261544 0.000068 None 3.213781 [[0.9999999999999999]]
29 0.028 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.255018 0.0 0.252024 0.000064 0.000064 0.002994 0.000064 0.252024 0.000064 0.252024 0.000064 None 3.842380 [[1.0]]
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
971 0.970 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.431501 0.0 0.451949 0.000204 0.000204 -0.020448 0.000204 0.451949 0.000204 0.451949 0.000204 None 2.305827 [[0.9999999999999999]]
972 0.971 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.433249 0.0 0.431501 0.000186 0.000186 0.001748 0.000186 0.431501 0.000186 0.431501 0.000186 None 3.366973 [[1.0]]
973 0.972 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.423918 0.0 0.433249 0.000188 0.000188 -0.009331 0.000188 0.433249 0.000188 0.433249 0.000188 None 3.139332 [[1.0]]
974 0.973 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.435187 0.0 0.423918 0.000180 0.000180 0.011269 0.000180 0.423918 0.000180 0.423918 0.000180 None 3.039740 [[1.0]]
975 0.974 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.426206 0.0 0.435187 0.000189 0.000189 -0.008981 0.000189 0.435187 0.000189 0.435187 0.000189 None 3.153815 [[1.0]]
976 0.975 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.420193 0.0 0.426206 0.000182 0.000182 -0.006014 0.000182 0.426206 0.000182 0.426206 0.000182 None 3.288031 [[1.0]]
977 0.976 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.395085 0.0 0.420193 0.000177 0.000177 -0.025108 0.000177 0.420193 0.000177 0.420193 0.000177 None 1.617442 [[1.0]]
978 0.977 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.389434 0.0 0.395085 0.000156 0.000156 -0.005651 0.000156 0.395085 0.000156 0.395085 0.000156 None 3.361104 [[1.0]]
979 0.978 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.359584 0.0 0.389434 0.000152 0.000152 -0.029850 0.000152 0.389434 0.000152 0.389434 0.000152 None 0.541623 [[1.0]]
980 0.979 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.341573 0.0 0.359584 0.000129 0.000129 -0.018011 0.000129 0.359584 0.000129 0.359584 0.000129 None 2.303750 [[1.0]]
981 0.980 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.349787 0.0 0.341573 0.000117 0.000117 0.008214 0.000117 0.341573 0.000117 0.341573 0.000117 None 3.319911 [[1.0]]
982 0.981 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.358479 0.0 0.349787 0.000122 0.000122 0.008692 0.000122 0.349787 0.000122 0.349787 0.000122 None 3.276534 [[1.0]]
983 0.982 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.363302 0.0 0.358479 0.000129 0.000129 0.004823 0.000129 0.358479 0.000129 0.358479 0.000129 None 3.470113 [[1.0]]
984 0.983 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.352193 0.0 0.363302 0.000132 0.000132 -0.011109 0.000132 0.363302 0.000132 0.363302 0.000132 None 3.079923 [[1.0]]
985 0.984 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.351661 0.0 0.352193 0.000124 0.000124 -0.000531 0.000124 0.352193 0.000124 0.352193 0.000124 None 3.577128 [[1.0]]
986 0.985 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.351621 0.0 0.351661 0.000124 0.000124 -0.000040 0.000124 0.351661 0.000124 0.351661 0.000124 None 3.579769 [[1.0]]
987 0.986 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.338741 0.0 0.351621 0.000124 0.000124 -0.012880 0.000124 0.351621 0.000124 0.351621 0.000124 None 2.909321 [[1.0]]
988 0.987 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.354845 0.0 0.338741 0.000115 0.000115 0.016104 0.000115 0.338741 0.000115 0.338741 0.000115 None 2.487670 [[0.9999999999999999]]
989 0.988 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.364690 0.0 0.354845 0.000126 0.000126 0.009845 0.000126 0.354845 0.000126 0.354845 0.000126 None 3.186072 [[1.0]]
990 0.989 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.362142 0.0 0.364690 0.000133 0.000133 -0.002548 0.000133 0.364690 0.000133 0.364690 0.000133 None 3.518995 [[1.0]]
991 0.990 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.362450 0.0 0.362142 0.000131 0.000131 0.000308 0.000131 0.362142 0.000131 0.362142 0.000131 None 3.550046 [[1.0]]
992 0.991 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.364838 0.0 0.362450 0.000131 0.000131 0.002388 0.000131 0.362450 0.000131 0.362450 0.000131 None 3.527857 [[1.0]]
993 0.992 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.341283 0.0 0.364838 0.000133 0.000133 -0.023556 0.000133 0.364838 0.000133 0.364838 0.000133 None 1.459691 [[1.0]]
994 0.993 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.338615 0.0 0.341283 0.000117 0.000117 -0.002668 0.000117 0.341283 0.000117 0.341283 0.000117 None 3.579200 [[1.0]]
995 0.994 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.331312 0.0 0.338615 0.000115 0.000115 -0.007303 0.000115 0.338615 0.000115 0.338615 0.000115 None 3.385146 [[1.0]]
996 0.995 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.320818 0.0 0.331312 0.000110 0.000110 -0.010494 0.000110 0.331312 0.000110 0.331312 0.000110 None 3.138012 [[0.9999999999999999]]
997 0.996 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.317967 0.0 0.320818 0.000103 0.000103 -0.002852 0.000103 0.320818 0.000103 0.320818 0.000103 None 3.632080 [[1.0]]
998 0.997 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.336042 0.0 0.317967 0.000101 0.000101 0.018076 0.000101 0.317967 0.000101 0.317967 0.000101 None 2.065468 [[1.0]]
999 0.998 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.342852 0.0 0.336042 0.000113 0.000113 0.006810 0.000113 0.336042 0.000113 0.336042 0.000113 None 3.419970 [[1.0]]
1000 0.999 KalmanFilter_2228659095872 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2228659093912 True 0.336660 0.0 0.342852 0.000118 0.000118 -0.006193 0.000118 0.342852 0.000118 0.342852 0.000118 None 3.442104 [[0.9999999999999999]]

1001 rows × 19 columns


In [9]:
sp = visual.StatePlot(plot_obs_results=False)
sp.process_run_df(run_df.df)
sp.ax.set_ylim((0., .45));



In [10]:
pf = filtering.particle.ParticleFilter(t0, state_distr=N(mean=x0, cov=2.5), process=X)

In [11]:
observable = pf.create_observable(particle.ParticleFilterObsModel.create(1.), X)

In [12]:
pf.predict(0.0001)

In [13]:
pf.mean


Out[13]:
array([0.41408505])

In [14]:
pf.var


Out[14]:
array([2.48376226])

In [15]:
pf.time


Out[15]:
0.0001