はじめに
pythonにちょうど良い時系列フィルタの実装が無かったので自作しました。
実装したもの
以下を実装した。
カルマンフィルタ
インスタンス生成時に下記の行列 $F, G, Q, H, R$ をそれぞれ指定する。
状態空間表現
x_{n+1} = F x_n + G v_n, \hspace{1em} v_n \sim N(O,Q) \\
y_n = H x_n + w_n, \hspace{2em} w_n \sim N(O,R)
できること
- 尤度計算
- フィルタリング
- 固定区間スムージング
粒子フィルタ
インスタンス生成時に、状態遷移用のメソッド update
、対数尤度計算用メソッド loglikelihood
、状態推定用メソッド estimate
をそれぞれ指定する。
状態空間表現
x_{n+1} = F(x_n, v_n) \\
y_n = H(x_n) + w_n
できること
- 尤度計算
- フィルタリング
- 固定ラグスムージング
リポジトリ
使い方はREADME参照
ryskiwt/tsfilter: Time Series Filtering
工夫とか
- 汎用的に使えるように、生成時に状態空間モデルを指定できるようにしてある
- 事前にメモリ確保したり、配列コピーさせないようにしてで、きるだけ速度には気をつけた
- そのかわりメモリ結構食います
- 粒子フィルタのランダムサンプリングは
Numba
使って速くした- Cython とも比較したけど、そんなに変わらなかったのでこちらを採用
今後
- 信号は出力するけど、状態を出力しないので、そこを改善する