Python
numpy
時系列解析

pythonで時系列フィルタするパッケージをつくった

はじめに

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 とも比較したけど、そんなに変わらなかったのでこちらを採用

今後

  • 信号は出力するけど、状態を出力しないので、そこを改善する