ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

EMアルゴリズムをirisデータセットで試す(PRML 9-2)

前期に引き続いてPRMLの自主ゼミをしているわけですが、後期に入って下巻に突入。本を参考にEMアルゴリズムを実装してみることになった。

PRMLの9章2節に混合ガウス分布EMアルゴリズムを用いて最尤推定する手順が記されており、それを元に実装した。

以下のリンクの枠組みだけは参考にしつつ、中のコードはできるだけ自分で考えて書いた。とりあえず動かすことを目標にしていたので計算量的にかなり無駄な計算をしていたり綺麗ではないコードではあるが...

qiita.com

実装したやつ

gist.github.com

まずは本にあったようにold_faithfulとかいう間欠泉データに対して試してみた。

ゼミのメンバーに分散共分散行列のプロットをしている人がいたので僕も描画してみようと思ってネットでコード探してほぼコピペして使ったりしてる。

分散共分散行列の逆行列が存在しない場合があるので適当に小さい単位行列を足す処理を入れている。

初期値にけっこう依存するけどうまく初期値が選ばれるとちゃんと分類される。

f:id:potaxyz:20211104002418p:plain
old faithfulデータにEMアルゴリズムを適用

次にirisでやってみているメンバーがいたので僕もやってみた。

こっちもけっこう初期値に依存するが、うまく初期値が選ばれていれば良い感じに分類された。

4次元のデータセットなので2次元に射影したやつにプロットしている。

EMアルゴリズムを試した結果。

f:id:potaxyz:20211104002811p:plain
irisデータセットEMアルゴリズムを適用

答えのラベルがirisデータセットについてるので正しい分類もプロットしてみた。

f:id:potaxyz:20211104002840p:plain
irisデータセットの正解

目視ではわからないので正解と不正解のプロットをしてみた。今回の場合は正解率が97%くらいになっててうまく分類できた。(うまくいかない時は30%台になったりほぼ2クラスにしか分類されなかったりとかするのでランダムに選んでる初期値が良い感じになってくれるまで何回か試しています)

f:id:potaxyz:20211104002956p:plain
irisデータセットの正解率

こうやって実際に実装してみると面白いですね!