前期に引き続いてPRMLの自主ゼミをしているわけですが、後期に入って下巻に突入。本を参考にEMアルゴリズムを実装してみることになった。
PRMLの9章2節に混合ガウス分布をEMアルゴリズムを用いて最尤推定する手順が記されており、それを元に実装した。
以下のリンクの枠組みだけは参考にしつつ、中のコードはできるだけ自分で考えて書いた。とりあえず動かすことを目標にしていたので計算量的にかなり無駄な計算をしていたり綺麗ではないコードではあるが...
実装したやつ
まずは本にあったようにold_faithfulとかいう間欠泉データに対して試してみた。
ゼミのメンバーに分散共分散行列のプロットをしている人がいたので僕も描画してみようと思ってネットでコード探してほぼコピペして使ったりしてる。
分散共分散行列の逆行列が存在しない場合があるので適当に小さい単位行列を足す処理を入れている。
初期値にけっこう依存するけどうまく初期値が選ばれるとちゃんと分類される。
次にirisでやってみているメンバーがいたので僕もやってみた。
こっちもけっこう初期値に依存するが、うまく初期値が選ばれていれば良い感じに分類された。
4次元のデータセットなので2次元に射影したやつにプロットしている。
EMアルゴリズムを試した結果。
答えのラベルがirisデータセットについてるので正しい分類もプロットしてみた。
目視ではわからないので正解と不正解のプロットをしてみた。今回の場合は正解率が97%くらいになっててうまく分類できた。(うまくいかない時は30%台になったりほぼ2クラスにしか分類されなかったりとかするのでランダムに選んでる初期値が良い感じになってくれるまで何回か試しています)
こうやって実際に実装してみると面白いですね!