動的モード分解にL2正則化を適用する
はじめに
] という時系列データがあったとき、 と線形に時間発展するとします。
この線形作用素をいくつかの固有値(時間成分)と固有モード(空間成分)の組に分解する手法が動的モード分解(Dynamic Mode Decomposition,DMD)です。
固有値の値によって、そのモードが時間的に振動するのか、増幅・減衰するのかが分かります。
僕が実装しているDMDでは、固有値や固有モードには興味がなく、線形作用素による未来の予測に興味があります。
未来の予測を安定化させるために、DMDにL2正則化を適用しました。
普通に線形作用素を求める
固有値や固有モードを求めたい場合は特異値分解などを用いた計算が必要ですが、だけを求めたい場合は簡単です。
時系列データ]があったとき、
]
]
とします。
ここでを次元ベクトルとすると、はの行列になります。
線形作用素はを使って
という式で表すことができます。
この誤差が最小になるように最小化問題、
を解くことでを求めることができます。
この最小化問題は
と書き表されます。 ()
(参考:「ベクトルで微分・行列で微分」公式まとめ - Qiita )
と式変換され、結果
とが求まります。
を使った予測
を使うことで未来の状態を予測できます。
時刻の状態を求めたいとき、初期状態をとすると
と求まります。
このとき、の固有値全てのノルムが1未満であるとき、は安定となります。
(参考: 離散的な線形システムの安定性を確認する方法:制御工学入門|Tajima Robotics)
また、理論的な事は理解してませんが、を求める際にL2正則化を加えることで固有値の絶対値が小さくなり、安定なを求めることができるようになります。
L2正則化項を加えてを求める
を求めるための最小化問題にL2正則化項を加えると、
となります。(は正則化の強さを決めるパラメータ)
正則化項がない場合と同様に、
と、による偏微分が0になるように求められます。
上式左辺のカッコ内第一項目の偏微分はさきほど求めたので、第二項目の偏微分
を求めます。
より、
よって、
となり、第一項目の偏微分と合わせると、
となる。
これを解くと、
とが求まりました。
を0にすると正則化がない場合と一致することも確認できます。
結果
手持ちのデータ(100次元)でやってみました。
制御項も加わり、というような式で予測してますが結果に大きな変化はないと思うので気にしないでください。
の場合
のノルム(フロベニウスノルム)は394.96
こので予測をすると発散してしまいました。
の場合
ノルムは49.24
これも発散してしまいました。
の場合
ノルムは4.73
発散せず予測することができました。
の場合
ノルムは4.38と、と比較してあまり小さくなりませんでした。
と同じく発散しませんでした。
コード
ノルムや上の画像を表示させるためのPythonコード
import numpy.linalg as la import matplotlib.pyplot as plt # ノルム norm = la.norm(A) # ヒートマップの描画 plt.imshow(A) # 固有値取得 w, v = la.eig(A) # 固有値の複素平面上の分布 plt.scatter(w.real, w.imag)
おわりに
おしまい