ディリクレ過程混合ガウスモデル (DPGMM) による教師無しクラスタリングをJuliaで実装した
概要
ディリクレ過程混合ガウスモデル
混合ガウスモデル(GMM: Gaussian Mixture Model)によるクラスタリングはクラスタ数を事前に決めておかないといけないけど, 実際の問題ではクラスタ数が事前にわかることはほぼ無く,いろいろなクラスタ数でクラスタリングを試してみないといけない.
ディリクレ過程混合ガウスモデル(DPGMM: Dirichlet Process GMM)では,無限のクラスタ数をもつGMMでデータをクラスタリングすることで,クラスタ数も同時に推定する. 無限混合ガウスモデル(IGMM: Infinite GMM)とも呼ばれる.
ほかの参考文献
MLPの佐藤『ノンパラメトリックベイズ』にも無限混合ガウスモデルの話は出てくるけど, そちらは簡単のために各混合要素のガウス分布の共分散が対角行列であることを仮定している.
続パタは共分散が対角行列じゃない一般のケースについて導出している. また,途中まではガウス分布に限らない一般のディリクレ過程混合モデルとして式を導出してくれてるので, ガウス分布以外の無限混合モデルへの変形がしやすい.
書籍以外だと以下の資料がよくまとまってておすすめ.
Juliaで実装した
超書きやすかったです.今年もJuliaの時代が来ますね.
どう書きやすかったかというと, 手で導出した式とプログラム上での式の表記がかなり近い形になってくれるところ.
Pythonと比べて, 気兼ねなくfor文を使えるのと1次元のベクトルが扱いやすいのが嬉しい. あとJuliaはアニメーションの生成が超やりやすい.
コードは以下で公開している. 須山ベイズのGMMの説明を基にGMMの学習のGibbsサンプリングを実装し, それを無限のクラスタ数に拡張する感じで実装した.
実験
今回クラスタリングの対象としたのは以下のような2次元のトイデータ. クラスタ数5のGMMからランダムにサンプリングした.
Gibbsサンプリングの過程は以下のGIFのようになる. 初期のクラスタ数は1にしてて,繰り返しの数が増えるとだんだん5前後ぐらいに落ち着く. 落ち着くといっても,データが与えられた下での潜在変数の事後分布からランダムサンプリングしていることになるので収束しているわけではないことに注意.
計算時間は,1000回のサンプリングを50回ごとにグラフをプロットしながら実行しても100秒程度 だったので実際はもっと早いと思う.
得られたサンプルのうち,事後確率が一番高くなるものを推定結果として採用する. MLPの岩田『トピックモデル』の言葉を使うと,このような推定の仕方を確率的EMアルゴリズムと呼ぶ.
以下は事後確率を最大化するクラスタ割り当てとGMMを可視化したもの.
おわり