間に合うかわからんが、Wiener-Hopf解を解く共役勾配法を試してみるのだ。 上手く行かなくていじけて寝てたりしたら20:00。大きく変化しすぎているように見えたので、係数更新量をステップサイズで調節できるようにしたら、マトモな、NLMS以上の性能を出し始めた。おそらくこれが意図した性能のはず。
簡単に見てみると、i.i.d.なノイズに対しては収束がかなり早い。NGSA以上。論文で言ってたようにRLSクラスに見える。
相関ありノイズ入力では性能が落ちる。勾配の尾根には早く達するが、そこからが遅い。最適値に収束するまでにSAに追いつかれるパターンも見られた。
自己相関行列は事前に計算したほうが性能が良い風に見受けられる(しかし、適応計算を考えて、デフォルトでは指数的更新則を使う)。また、ポラック・リビエールではなくガチの共役勾配法で勾配の結合係数を計算したら性能がより良くなったように見える。
指数平均の更新則は(alpha * prev + (1-alpha) * current)ではなく(alpha * prev + current)が正しいので見つけ次第直している。
さて、これをSA化しようと思っている。アルゴリズムの途中にLMSの勾配が現れているので、これをSA化すればいいじゃんと思ったら、非常に性能が悪くなった。最適値周辺で暴れまくる。ちゃんと式を追いましょう。
うーん、わからん。共役勾配法は完全にWiener-Hopf方程式を解こうとしている。g(勾配)はWiener-Hopfとのズレ(残差ベクトル)として定義されている。そのズレをSAの勾配に置き換えても上手く行かない。。。
どうしようか、報告としては、共役勾配法があって強力なんだけどSAとして持っていけない…という風に持っていこうかな。glassoはたしかに良いんだけど、効率的な更新方法が見つからない。というかんじ。
ソース整理開始。glassoをsubmoduleにぶっこむのがTODO。