In [15]:
%matplotlib notebook

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

In [17]:
import collections as col

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

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

import importlib
importlib.reload(optvisual)
importlib.reload(npu)
importlib.reload(optimization)
importlib.reload(filtering)


Out[17]:
<module 'thalesians.tsa.filtering' from 'S:\\dev\\tsa\\src\\main\\python\\thalesians\\tsa\\filtering\\__init__.py'>

In [18]:
npu.init_warnings()

In [19]:
rnd.random_state(np.random.RandomState(seed=42), force=True);

In [20]:
X = proc.OrnsteinUhlenbeckProcess.create_multiscale_from_vol(transition_vector=[10., 10.], mean=15., vol=[[10., .0], [.0, 1.]])

In [21]:
X.transition


Out[21]:
array([[ 10.,   0.],
       [-10.,  10.]])

In [22]:
em = sim.EulerMaruyama(process=X, times=sim.xtimes(start=0., stop=5., step=.002))
df = sim.run(em)
plt.plot(df);



In [9]:
filtr = filtering.kalman.KalmanFilter(time=df.index[0], state_distr=N(mean=npu.col(0., 0.), cov=1000. * np.eye(2)), process=X)
state_observable = filtr.create_identity_observable(X)
first_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[1., 0.]]), X)
last_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[0., 1.]]), X)

In [10]:
run_df = filtering.run(observable=last_observable, obss=1, df=df, return_df=True)

In [11]:
run_df.df


Out[11]:
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_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... None None NaN NaN NaN NaN None NaN NaN [[0.0], [0.0]] [[1000.0, 0.0], [0.0, 1000.0]] [[0.0], [0.0]] [[1000.0, 0.0], [0.0, 1000.0]] None NaN None
1 0.000 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.000000 0.0 0.000000 1000.000000 [[0.0, 1000.0]] 0.000000 1000.000000 [[0.0], [0.0]] [[1000.0, 0.0], [0.0, 1000.0]] [[0.0], [0.0]] [[1000.0, 0.0], [0.0, 1000.0]] None -4.372816 [[0.0], [1.0]]
2 0.002 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True -0.018550 0.0 0.005881 1.524274 [[38.0536803019, 1.52427428591]] -0.024431 1.524274 [[0.297019900399], [0.00588138808219]] [[960.985491957, 38.0536803019], [38.053680301... [[0.297019900399], [0.00588138808219]] [[960.985491957, 38.0536803019], [38.053680301... None -1.129894 [[24.9651133353], [1.0]]
3 0.004 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.207413 0.0 -0.024088 0.033933 [[0.421315561188, 0.0339327889712]] 0.231502 0.033933 [[-0.00969899966277], [-0.024088236855]] [[10.7369221599, 0.421315561188], [0.421315561... [[-0.00969899966277], [-0.024088236855]] [[10.7369221599, 0.421315561188], [0.421315561... None -0.016945 [[12.4161783915], [1.0]]
4 0.006 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.211758 0.0 0.316364 0.025697 [[0.213363549245, 0.0256973375212]] -0.104606 0.025697 [[3.10496100611], [0.31636380678]] [[5.4859605661, 0.213363549245], [0.2133635492... [[3.10496100611], [0.31636380678]] [[5.4859605661, 0.213363549245], [0.2133635492... None 0.698837 [[8.30294379986], [1.0]]
5 0.008 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.357234 0.0 0.296151 0.022998 [[0.145201955233, 0.0229979575393]] 0.061083 0.022998 [[2.48916042052], [0.296150799066]] [[3.76482351635, 0.145201955233], [0.145201955... [[2.48916042052], [0.296150799066]] [[3.76482351635, 0.145201955233], [0.145201955... None 0.886117 [[6.31368916064], [1.0]]
6 0.010 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.505951 0.0 0.460704 0.021692 [[0.112237444193, 0.0216924754345]] 0.045247 0.021692 [[3.11491588387], [0.460704275713]] [[2.93244214235, 0.112237444193], [0.112237444... [[3.11491588387], [0.460704275713]] [[2.93244214235, 0.112237444193], [0.112237444... None 0.949268 [[5.17402656657], [1.0]]
7 0.012 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.515241 0.0 0.621998 0.020945 [[0.0933517674056, 0.0209445525227]] -0.106757 0.020945 [[3.57972924533], [0.621997921064]] [[2.45556306551, 0.0933517674056], [0.09335176... [[3.57972924533], [0.621997921064]] [[2.45556306551, 0.0933517674056], [0.09335176... None 0.741922 [[4.45709056349], [1.0]]
8 0.014 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.331819 0.0 0.621408 0.020474 [[0.0814712145983, 0.0204740511079]] -0.289589 0.020474 [[3.33946154134], [0.621408058448]] [[2.15556920673, 0.0814712145983], [0.08147121... [[3.33946154134], [0.621408058448]] [[2.15556920673, 0.0814712145983], [0.08147121... None -1.022636 [[3.9792425138], [1.0]]
9 0.016 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.351440 0.0 0.409591 0.020160 [[0.073552657065, 0.0201604552186]] -0.058150 0.020160 [[2.44083028939], [0.409590589302]] [[1.95561903027, 0.073552657065], [0.073552657... [[2.44083028939], [0.409590589302]] [[1.95561903027, 0.073552657065], [0.073552657... None 0.949214 [[3.64836290984], [1.0]]
10 0.018 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.466853 0.0 0.430055 0.019943 [[0.0680695559363, 0.0199433098651]] 0.036798 0.019943 [[2.4815663255], [0.430055420045]] [[1.81716615755, 0.0680695559363], [0.06806955... [[2.4815663255], [0.430055420045]] [[1.81716615755, 0.0680695559363], [0.06806955... None 1.004544 [[3.41315240032], [1.0]]
11 0.020 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.338144 0.0 0.555635 0.019789 [[0.0641718149005, 0.0197889489779]] -0.217491 0.019789 [[2.85255681121], [0.555634892748]] [[1.7187449483, 0.0641718149005], [0.064171814... [[2.85255681121], [0.555634892748]] [[1.7187449483, 0.0641718149005], [0.064171814... None -0.152794 [[3.24281067036], [1.0]]
12 0.022 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.367940 0.0 0.414120 0.019677 [[0.061349033077, 0.0196771593277]] -0.046180 0.019677 [[2.40177536587], [0.414120272713]] [[1.64746735495, 0.061349033077], [0.061349033... [[2.40177536587], [0.414120272713]] [[1.64746735495, 0.061349033077], [0.061349033... None 0.991020 [[3.11777894641], [1.0]]
13 0.024 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.272432 0.0 0.447039 0.019595 [[0.0592770964012, 0.0195951051377]] -0.174607 0.019595 [[2.51010847078], [0.447038569864]] [[1.59514922728, 0.0592770964012], [0.05927709... [[2.51010847078], [0.447038569864]] [[1.59514922728, 0.0592770964012], [0.05927709... None 0.269361 [[3.02509713445], [1.0]]
14 0.026 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.397776 0.0 0.344565 0.019534 [[0.0577412394258, 0.0195342811263]] 0.053211 0.019534 [[2.23968138022], [0.344565474353]] [[1.55636755878, 0.0577412394258], [0.05774123... [[2.23968138022], [0.344565474353]] [[1.55636755878, 0.0577412394258], [0.05774123... None 0.976381 [[2.95589272278], [1.0]]
15 0.028 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.553465 0.0 0.481107 0.019489 [[0.0565944332063, 0.019488864557]] 0.072358 0.019489 [[2.64652371426], [0.481107263145]] [[1.52740974607, 0.0565944332063], [0.05659443... [[2.64652371426], [0.481107263145]] [[1.52740974607, 0.0565944332063], [0.05659443... None 0.915693 [[2.90393691437], [1.0]]
16 0.030 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.602373 0.0 0.648535 0.019455 [[0.0557334585548, 0.0194547676763]] -0.046163 0.019455 [[3.09710070807], [0.648535402541]] [[1.50566941865, 0.0557334585548], [0.05573345... [[3.09710070807], [0.648535402541]] [[1.50566941865, 0.0557334585548], [0.05573345... None 0.996125 [[2.86477122122], [1.0]]
17 0.032 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.936020 0.0 0.699726 0.019429 [[0.0550844325836, 0.0194290645258]] 0.236294 0.019429 [[3.20316711718], [0.699725910763]] [[1.48928097203, 0.0550844325836], [0.05508443... [[3.20316711718], [0.699725910763]] [[1.48928097203, 0.0550844325836], [0.05508443... None -0.385337 [[2.83515619141], [1.0]]
18 0.034 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.864957 0.0 1.055547 0.019410 [[0.0545936734028, 0.01940962916]] -0.190590 0.019410 [[4.09342516], [1.05554722896]] [[1.47688889375, 0.0545936734028], [0.05459367... [[4.09342516], [1.05554722896]] [[1.47688889375, 0.0545936734028], [0.05459367... None 0.116317 [[2.81271079178], [1.0]]
19 0.036 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.784443 0.0 0.975014 0.019395 [[0.0542217242267, 0.0193948989857]] -0.190571 0.019395 [[3.78392964241], [0.975013825497]] [[1.4674968671, 0.0542217242267], [0.054221724... [[3.78392964241], [0.975013825497]] [[1.4674968671, 0.0542217242267], [0.054221724... None 0.116175 [[2.79566932865], [1.0]]
20 0.038 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.632382 0.0 0.885771 0.019384 [[0.0539393252376, 0.0193837152365]] -0.253389 0.019384 [[3.48379893151], [0.885770708519]] [[1.46036605729, 0.0539393252376], [0.05393932... [[3.48379893151], [0.885770708519]] [[1.46036605729, 0.0539393252376], [0.05393932... None -0.603459 [[2.78271345712], [1.0]]
21 0.040 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.788624 0.0 0.721332 0.019375 [[0.0537246297624, 0.019375212726]] 0.067292 0.019375 [[3.02068858216], [0.721331730238]] [[1.45494481763, 0.0537246297624], [0.05372462... [[3.02068858216], [0.721331730238]] [[1.45494481763, 0.0537246297624], [0.05372462... None 0.936085 [[2.77285367249], [1.0]]
22 0.042 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 0.920334 0.0 0.888085 0.019369 [[0.053561240434, 0.019368742075]] 0.032250 0.019369 [[3.44079162627], [0.888084675771]] [[1.45081910093, 0.053561240434], [0.053561240... [[3.44079162627], [0.888084675771]] [[1.45081910093, 0.053561240434], [0.053561240... None 1.026260 [[2.76534429683], [1.0]]
23 0.044 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.005792 0.0 1.027157 0.019364 [[0.0534368004091, 0.0193638139199]] -0.021365 0.019364 [[3.75709473269], [1.02715702211]] [[1.4476768866, 0.0534368004091], [0.053436800... [[3.75709473269], [1.02715702211]] [[1.4476768866, 0.0534368004091], [0.053436800... None 1.041450 [[2.75962166494], [1.0]]
24 0.046 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.038330 0.0 1.115792 0.019360 [[0.0533419690294, 0.0193600583456]] -0.077462 0.019360 [[3.92192805016], [1.11579197819]] [[1.44528231524, 0.0533419690294], [0.05334196... [[3.92192805016], [1.11579197819]] [[1.44528231524, 0.0533419690294], [0.05334196... None 0.898365 [[2.75525869175], [1.0]]
25 0.048 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.290135 0.0 1.147456 0.019357 [[0.0532696689451, 0.0193571950704]] 0.142679 0.019357 [[3.93208655019], [1.14745603351]] [[1.44345667786, 0.0532696689451], [0.05326966... [[3.93208655019], [1.14745603351]] [[1.44345667786, 0.0532696689451], [0.05326966... None 0.527571 [[2.75193119413], [1.0]]
26 0.050 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.154234 0.0 1.413309 0.019355 [[0.0532145280246, 0.0193550113437]] -0.259075 0.019355 [[4.53611499018], [1.4133093184]] [[1.44206432367, 0.0532145280246], [0.05321452... [[4.53611499018], [1.4133093184]] [[1.44206432367, 0.0532145280246], [0.05321452... None -0.680456 [[2.74939275828], [1.0]]
27 0.052 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.223743 0.0 1.263292 0.019353 [[0.0531724628737, 0.0193533454521]] -0.039549 0.019353 [[4.04511836098], [1.26329182999]] [[1.44100214355, 0.0531724628737], [0.05317246... [[4.04511836098], [1.26329182999]] [[1.44100214355, 0.0531724628737], [0.05317246... None 1.013097 [[2.74745588588], [1.0]]
28 0.054 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.438651 0.0 1.334448 0.019352 [[0.0531403664038, 0.0193520743467]] 0.104203 0.019352 [[4.15553245322], [1.33444806752]] [[1.44019168094, 0.0531403664038], [0.05314036... [[4.15553245322], [1.33444806752]] [[1.44019168094, 0.0531403664038], [0.05314036... None 0.772992 [[2.74597779296], [1.0]]
29 0.056 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 1.684098 0.0 1.560541 0.019351 [[0.0531158725008, 0.0193511043231]] 0.123556 0.019351 [[4.65074138251], [1.56054138261]] [[1.43957318948, 0.0531158725008], [0.05311587... [[4.65074138251], [1.56054138261]] [[1.43957318948, 0.0531158725008], [0.05311587... None 0.659112 [[2.74484967958], [1.0]]
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2472 4.942 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 13.947659 0.0 13.935163 0.019348 [[0.0530368656447, 0.019347975442]] 0.012496 0.019348 [[14.2801601752], [13.9351631172]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.2801601752], [13.9351631172]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.049610 [[2.74121009734], [1.0]]
2473 4.944 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 13.913073 0.0 13.962308 0.019348 [[0.0530368656447, 0.019347975442]] -0.049235 0.019348 [[14.327989042], [13.9623082902]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.327989042], [13.9623082902]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.991001 [[2.74121009734], [1.0]]
2474 4.946 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.118166 0.0 13.924367 0.019348 [[0.0530368656447, 0.019347975442]] 0.193799 0.019348 [[14.2090045747], [13.9243667239]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.2090045747], [13.9243667239]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.083049 [[2.74121009734], [1.0]]
2475 4.948 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.027289 0.0 14.142660 0.019348 [[0.0530368656447, 0.019347975442]] -0.115371 0.019348 [[14.7453924319], [14.1426600391]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.7453924319], [14.1426600391]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.709671 [[2.74121009734], [1.0]]
2476 4.950 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.163108 0.0 14.043270 0.019348 [[0.0530368656447, 0.019347975442]] 0.119838 0.019348 [[14.4404409647], [14.0432698535]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.4404409647], [14.0432698535]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.682518 [[2.74121009734], [1.0]]
2477 4.952 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.395653 0.0 14.186953 0.019348 [[0.0530368656447, 0.019347975442]] 0.208699 0.019348 [[14.7735168692], [14.1869533579]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.7735168692], [14.1869533579]] [[1.43757820052, 0.0530368656447], [0.05303686... None -0.071934 [[2.74121009734], [1.0]]
2478 4.954 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.584530 0.0 14.432765 0.019348 [[0.0530368656447, 0.019347975442]] 0.151764 0.019348 [[15.3387619072], [14.4327652754]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.3387619072], [14.4327652754]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.458429 [[2.74121009734], [1.0]]
2479 4.956 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.462815 0.0 14.630120 0.019348 [[0.0530368656447, 0.019347975442]] -0.167305 0.019348 [[15.7398344849], [14.6301199506]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.7398344849], [14.6301199506]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.330285 [[2.74121009734], [1.0]]
2480 4.958 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.679474 0.0 14.494794 0.019348 [[0.0530368656447, 0.019347975442]] 0.184679 0.019348 [[15.2756466781], [14.4947941901]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.2756466781], [14.4947941901]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.172248 [[2.74121009734], [1.0]]
2481 4.960 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.808177 0.0 14.722393 0.019348 [[0.0530368656447, 0.019347975442]] 0.085784 0.019348 [[15.7664092911], [14.7223934771]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.7664092911], [14.7223934771]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.863473 [[2.74121009734], [1.0]]
2482 4.962 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.724183 0.0 14.854578 0.019348 [[0.0530368656447, 0.019347975442]] -0.130395 0.019348 [[15.9817287518], [14.8545779146]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.9817287518], [14.8545779146]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.614251 [[2.74121009734], [1.0]]
2483 4.964 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.816544 0.0 14.759232 0.019348 [[0.0530368656447, 0.019347975442]] 0.057312 0.019348 [[15.6119276455], [14.759232076]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.6119276455], [14.759232076]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.968762 [[2.74121009734], [1.0]]
2484 4.966 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.829119 0.0 14.853590 0.019348 [[0.0530368656447, 0.019347975442]] -0.024471 0.019348 [[15.7538030361], [14.8535897317]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.7538030361], [14.8535897317]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.038170 [[2.74121009734], [1.0]]
2485 4.968 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.010511 0.0 14.862477 0.019348 [[0.0530368656447, 0.019347975442]] 0.148034 0.019348 [[15.673125632], [14.8624769193]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.673125632], [14.8624769193]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.487329 [[2.74121009734], [1.0]]
2486 4.970 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.212099 0.0 15.051981 0.019348 [[0.0530368656447, 0.019347975442]] 0.160118 0.019348 [[16.0575547946], [15.0519810686]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.0575547946], [15.0519810686]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.391098 [[2.74121009734], [1.0]]
2487 4.972 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.194434 0.0 15.261874 0.019348 [[0.0530368656447, 0.019347975442]] -0.067440 0.019348 [[16.4668406535], [15.2618736521]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.4668406535], [15.2618736521]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.936109 [[2.74121009734], [1.0]]
2488 4.974 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.935809 0.0 15.236574 0.019348 [[0.0530368656447, 0.019347975442]] -0.300765 0.019348 [[16.2565884533], [15.2365739592]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.2565884533], [15.2365739592]] [[1.43757820052, 0.0530368656447], [0.05303686... None -1.284063 [[2.74121009734], [1.0]]
2489 4.976 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.764442 0.0 14.955100 0.019348 [[0.0530368656447, 0.019347975442]] -0.190658 0.019348 [[15.4235704518], [14.9550999995]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.4235704518], [14.9550999995]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.114258 [[2.74121009734], [1.0]]
2490 4.978 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.773249 0.0 14.769833 0.019348 [[0.0530368656447, 0.019347975442]] 0.003416 0.019348 [[14.9028982412], [14.7698328169]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.9028982412], [14.7698328169]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.053344 [[2.74121009734], [1.0]]
2491 4.980 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.493245 0.0 14.778734 0.019348 [[0.0530368656447, 0.019347975442]] -0.285489 0.019348 [[14.9139987527], [14.7787336991]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.9139987527], [14.7787336991]] [[1.43757820052, 0.0530368656447], [0.05303686... None -1.052623 [[2.74121009734], [1.0]]
2492 4.982 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.648149 0.0 14.479397 0.019348 [[0.0530368656447, 0.019347975442]] 0.168751 0.019348 [[14.1486121234], [14.4793974729]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.1486121234], [14.4793974729]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.317730 [[2.74121009734], [1.0]]
2493 4.984 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.636350 0.0 14.646852 0.019348 [[0.0530368656447, 0.019347975442]] -0.010502 0.019348 [[14.618893258], [14.6468520435]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.618893258], [14.6468520435]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.050795 [[2.74121009734], [1.0]]
2494 4.986 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.869491 0.0 14.634698 0.019348 [[0.0530368656447, 0.019347975442]] 0.234794 0.019348 [[14.5982222881], [14.6346977688]] [[1.43757820052, 0.0530368656447], [0.05303686... [[14.5982222881], [14.6346977688]] [[1.43757820052, 0.0530368656447], [0.05303686... None -0.371001 [[2.74121009734], [1.0]]
2495 4.988 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 14.893270 0.0 14.883997 0.019348 [[0.0530368656447, 0.019347975442]] 0.009273 0.019348 [[15.2370521344], [14.8839965894]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.2370521344], [14.8839965894]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.051423 [[2.74121009734], [1.0]]
2496 4.990 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.223587 0.0 14.907644 0.019348 [[0.0530368656447, 0.019347975442]] 0.315943 0.019348 [[15.2572752911], [14.9076437608]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.2572752911], [14.9076437608]] [[1.43757820052, 0.0530368656447], [0.05303686... None -1.525950 [[2.74121009734], [1.0]]
2497 4.992 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.314762 0.0 15.258426 0.019348 [[0.0530368656447, 0.019347975442]] 0.056336 0.019348 [[16.1010974524], [15.2584260614]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.1010974524], [15.2584260614]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.971627 [[2.74121009734], [1.0]]
2498 4.994 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.348944 0.0 15.351158 0.019348 [[0.0530368656447, 0.019347975442]] -0.002214 0.019348 [[16.2306661216], [15.3511580454]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.2306661216], [15.3511580454]] [[1.43757820052, 0.0530368656447], [0.05303686... None 1.053519 [[2.74121009734], [1.0]]
2499 4.996 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.297680 0.0 15.382799 0.019348 [[0.0530368656447, 0.019347975442]] -0.085118 0.019348 [[16.2003484319], [15.3827987353]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.2003484319], [15.3827987353]] [[1.43757820052, 0.0530368656447], [0.05303686... None 0.866413 [[2.74121009734], [1.0]]
2500 4.998 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.661533 0.0 15.323546 0.019348 [[0.0530368656447, 0.019347975442]] 0.337986 0.019348 [[15.9478728258], [15.3235464409]] [[1.43757820052, 0.0530368656447], [0.05303686... [[15.9478728258], [15.3235464409]] [[1.43757820052, 0.0530368656447], [0.05303686... None -1.898464 [[2.74121009734], [1.0]]
2501 5.000 KalmanFilter_2145234408672 <class 'thalesians.tsa.filtering.kalman.Kalman... KalmanObservable_2145234409120 True 15.492974 0.0 15.708353 0.019348 [[0.0530368656447, 0.019347975442]] -0.215380 0.019348 [[16.8372490763], [15.7083534992]] [[1.43757820052, 0.0530368656447], [0.05303686... [[16.8372490763], [15.7083534992]] [[1.43757820052, 0.0530368656447], [0.05303686... None -0.145147 [[2.74121009734], [1.0]]

2502 rows × 19 columns


In [12]:
sp = visual.StatePlot(plot_obs_results=False)
sp.process_run_df(run_df.df)
sp.ax.set_ylim((-5, 25));



In [15]:
op = visual.ObsPlot();
op.process_run_df(run_df.df[1:])



In [16]:
ep = visual.InnovPlot()
ep.process_run_df(run_df.df[1:])
ep.ax.set_ylim((-1, 1));



In [19]:
llp = visual.ErrorPlot();
llp.process_run_df(run_df.df[1:])



In [18]:
llp = visual.LogLikelihoodPlot(cumulative=True);
llp.process_run_df(run_df.df)



In [20]:
llp = visual.LogLikelihoodPlot(cumulative=False)
llp.process_run_df(run_df.df)



In [21]:
cp = visual.CUSUMPlot()
cp.process_run_df(run_df.df)



In [22]:
gp = visual.GainPlot(matrix_norm=False)
gp.process_run_df(run_df.df)



In [23]:
gp = visual.GainPlot(matrix_norm=True)
gp.process_run_df(run_df.df)



In [21]:
filtr = filtering.kalman.KalmanFilter(time=df.index[0], state_distr=N(mean=npu.col(0., 0.), cov=1000. * np.eye(2)), process=X)
state_observable = filtr.create_identity_observable(X)
first_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[1., 0.]]), X)
last_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[0., 1.]]), X)

In [22]:
ts, priors, posteriors, prior_values, posterior_values = [], [], [], [], []
for i, t in enumerate(df.index):
    ts.append(t)
    priors.append(state_observable.predict(t))
    prior_values.append(priors[-1].distr.mean.flatten())
    process_value = df.iloc[i].values
    last_observable.observe(N(process_value[-1], 0.), t)
    posteriors.append(state_observable.predict(t))
    posterior_values.append(posteriors[-1].distr.mean.flatten())
priors_df = pd.DataFrame(data=priors, index=ts)
posteriors_df = pd.DataFrame(data=posteriors, index=ts)
prior_values_df = pd.DataFrame(data=prior_values, index=ts)
posterior_values_df = pd.DataFrame(data=posterior_values, index=ts)

In [23]:
plt.figure()
plt.plot(posterior_values_df);



In [24]:
plt.figure()
plt.plot(df);



In [30]:
len(posterior_values_df[0].values)


Out[30]:
2501

In [34]:
len(df[0].values)


Out[34]:
2501

In [40]:
plt.plot(df[0].values, posterior_values_df[0].values, 'x')


Out[40]:
[<matplotlib.lines.Line2D at 0x1f3009ce438>]

In [9]:
def filter_run(mu, sigma1, sigma2, theta1, theta2):
    X = proc.OrnsteinUhlenbeckProcess.create_multiscale_from_vol(transition_vector=[theta1, theta2], mean=mu, vol=[[sigma1, .0], [.0, sigma2]])
    filtr = filtering.kalman.KalmanFilter(time=df.index[0], state_distr=N(mean=npu.col(0., 0.), cov=1000. * np.eye(2)), process=X)
    state_observable = filtr.create_identity_observable(X)
    first_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[1., 0.]]), X)
    last_observable = filtr.create_observable(kalman.KalmanFilterObsModel.create([[0., 1.]]), X)
    filter_run_result = filtering.run(observable=last_observable, obss=1, df=df)
    return npu.to_scalar(filter_run_result.cumulative_log_likelihood if filter_run_result.cumulative_log_likelihood is not None else np.nan)

In [10]:
filter_run(mu=20., sigma1=10., sigma2=3., theta1=20., theta2=20.)


Out[10]:
2186.0014159249545

In [11]:
param_ranges = col.OrderedDict((
        ('mu', np.linspace(0., 40., 5)),
        ('sigma1', np.linspace(1., 20., 5)),
        ('sigma2', np.linspace(1., 20., 5)),
        ('theta1', np.linspace(.1, 30., 5)),
        ('theta2', np.linspace(.1, 30., 5))))

In [12]:
result = optimization.grid_search(
        filter_run, param_ranges,
        evaluator=evaluation.IPyParallelEvaluator(),
        optimization_id='OU process calibration: Kalman filter maximum likelihood')

In [13]:
result.evaluation_statuses[10]


Out[13]:
Status(ready=True, work=Work(work_id=11, func=<function filter_run at 0x000001D14DE21620>, args=[], kwargs=OrderedDict([('mu', 0.0), ('sigma1', 1.0), ('sigma2', 1.0), ('theta1', 15.049999999999999), ('theta2', 0.10000000000000001)]), call_count=1, repeat_count=1, info={'param_ranges': OrderedDict([('mu', array([  0.,  10.,  20.,  30.,  40.])), ('sigma1', array([  1.  ,   5.75,  10.5 ,  15.25,  20.  ])), ('sigma2', array([  1.  ,   5.75,  10.5 ,  15.25,  20.  ])), ('theta1', array([  0.1  ,   7.575,  15.05 ,  22.525,  30.   ])), ('theta2', array([  0.1  ,   7.575,  15.05 ,  22.525,  30.   ]))]), 'param_names': ['mu', 'sigma1', 'sigma2', 'theta1', 'theta2'], 'param_value_indices': [0, 0, 0, 2, 0], 'optimization_id': 'OU process calibration: Kalman filter maximum likelihood', 'work_id': 11}), result=Result(work_id=11, func=<function filter_run at 0x000001D14F994730>, args=[], kwargs=OrderedDict([('mu', 0.0), ('sigma1', 1.0), ('sigma2', 1.0), ('theta1', 15.049999999999999), ('theta2', 0.10000000000000001)]), call_count=1, repeat_count=1, info={'param_ranges': OrderedDict([('mu', array([  0.,  10.,  20.,  30.,  40.])), ('sigma1', array([  1.  ,   5.75,  10.5 ,  15.25,  20.  ])), ('sigma2', array([  1.  ,   5.75,  10.5 ,  15.25,  20.  ])), ('theta1', array([  0.1  ,   7.575,  15.05 ,  22.525,  30.   ])), ('theta2', array([  0.1  ,   7.575,  15.05 ,  22.525,  30.   ]))]), 'param_names': ['mu', 'sigma1', 'sigma2', 'theta1', 'theta2'], 'param_value_indices': [0, 0, 0, 2, 0], 'optimization_id': 'OU process calibration: Kalman filter maximum likelihood', 'work_id': 11}, evaluation_id="c8052c87895248a4b3be0c02cf82a185", result=3220.2841131338223, exception=None, start_datetime=2018-04-26 23:23:45.362055, seconds_per_call=[5.097369587871493], hostname="DESKTOP-EFQ7TT8", pid=10656, thread_id=10656))

In [14]:
optvisual.visualize_grid_search(result, refresh_until_ready=True, aggregate_func=np.nanmax, empty_aggregate=np.nan);


---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-14-c82eb26a56cd> in <module>()
----> 1 optvisual.visualize_grid_search(result, refresh_until_ready=True, aggregate_func=np.nanmax, empty_aggregate=np.nan);

S:\dev\tsa\src\main\python\thalesians\tsa\optimization\visual.py in visualize_grid_search(grid_search_result, aggregate_func, empty_aggregate, fig, title, refresh_until_ready)
     80         for i1 in range(len(param_names)):
     81             for i2 in range(i1):
---> 82                 new_data = _aggregate(aggregate_func, datas[(i1, i2)], empty_aggregate)
     83                 heatmaps[(i1, i2)].set_data(new_data)
     84                 heatmaps[(i1, i2)].autoscale()

S:\dev\tsa\src\main\python\thalesians\tsa\optimization\visual.py in _aggregate(aggregate_func, data, empty_aggregate)
     13 def _aggregate(aggregate_func, data, empty_aggregate):
     14     if empty_aggregate != 'none':
---> 15         return npu.apply(lambda x: empty_aggregate if len(x) == 0 else aggregate_func(x), data)
     16     else:
     17         return npu.apply(aggregate_func, data)

S:\dev\tsa\src\main\python\thalesians\tsa\numpyutils.py in apply(func, arg, dtype)
     14 def apply(func, arg, dtype=np.dtype('float64')):
     15     result = np.empty(np.shape(arg), dtype=dtype)
---> 16     result.flat[:] = [func(x) for x in arg.flat[:]]
     17     return result
     18 

S:\dev\tsa\src\main\python\thalesians\tsa\numpyutils.py in <listcomp>(.0)
     14 def apply(func, arg, dtype=np.dtype('float64')):
     15     result = np.empty(np.shape(arg), dtype=dtype)
---> 16     result.flat[:] = [func(x) for x in arg.flat[:]]
     17     return result
     18 

S:\dev\tsa\src\main\python\thalesians\tsa\optimization\visual.py in <lambda>(x)
     13 def _aggregate(aggregate_func, data, empty_aggregate):
     14     if empty_aggregate != 'none':
---> 15         return npu.apply(lambda x: empty_aggregate if len(x) == 0 else aggregate_func(x), data)
     16     else:
     17         return npu.apply(aggregate_func, data)

C:\Programs\Win64\Anaconda\V4.4.0_3.6\lib\site-packages\numpy\lib\nanfunctions.py in nanmax(a, axis, out, keepdims)
    351     else:
    352         # Slow, but safe for subclasses of ndarray
--> 353         a, mask = _replace_nan(a, -np.inf)
    354         res = np.amax(a, axis=axis, out=out, **kwargs)
    355         if mask is None:

C:\Programs\Win64\Anaconda\V4.4.0_3.6\lib\site-packages\numpy\lib\nanfunctions.py in _replace_nan(a, val)
     68         mask = a != a
     69     elif issubclass(a.dtype.type, np.inexact):
---> 70         mask = np.isnan(a)
     71     else:
     72         mask = None

KeyboardInterrupt: 

In [ ]: