SSブログ

DPMによるクラスタリングの実験 [学問]

 書籍「続・わかりやすいパターン認識」の第12章のディリクレ過程混合モデル(DPM)によるクラスタリング(ノンパラメトリックベイズ)の実験を、実際にpythonで実装して確認してみました。書籍では2種類のクラスタリング法の実験を行っていますが、今回はパラメータ推定も伴うクラスタリング法1の難しそうな方を行ってみました。前回の凸クラスタリング法もクラスタ数を推定する手法でしたが、ノンパラメトリックベイズはそのクラスタ数の推定を数学的にもっと美しくできるようにしたものです。ノンパラメトリックベイズとは、パラメータが無いということではなくて、「無限個のモデルを想定した無限個のパラメータを持ち得るベイズモデルの総称」のことです。


 初期状態は全ての500個の点がクラスタ0に所属する状態(c = 1)から始めています。その他ハイパーパラメータの値(式(12.33)と式(12.34))などは全て書籍のものに合わせて行っています。アルゴリズムはp260~261のStep1~Step5の「クラスタリング法1のアルゴリズム」に従ってpythonで実装してあります。


 ノンパラメトリックベイズではこれまでのクラスタリング法と違って、「サンプリング」という手法が用いられています。一つ目がp259の式(12.14)(下段の積分は、p269の式(12.35)で行います)で、sk=ωi(i=1~c)とsk=ωnewの事後確率からskを「確率的に」決定します。私はここは、pythonのnumpy.random.uniform()を使って行っています。二番目が、p259の式(12.15)(実際の計算は、p269の式(12.37)を用いて計算する)で、事後分布からc個のクラスタのパラメータθi(i=1~c)を「確率的に」決定します。具体的には、p269の式(12.37)の正規ーウィッシャート分布からサンプリングしたθi=(μi, Λi-1)を求めることになります。まず、ウィッシャート分布のΛiをW(Λi; νc, Sq)(ここで、νcは式(12.42)から、Sqは式(12.38)で計算する)からサンプリングします。私はここは、pythonのscipy.stats.wishart()を使って行いました。このサンプリングしたΛiで式(12.41)からΛcを計算して、N(μi; μc, Λc-1)(ここで、μcは式(12.40)で計算する)からμiをサンプリングします。私はここは、pythonのscipy.stats.multivariate_normal()を使って行いました。


 p261の式(12.16)のv(事後確率)の対数を取ったlogvの繰り返し数に対する変化を下図の「事後確率の変化」に示してあります。図中、logvが最大値となる繰り返し数の位置を赤の波線で示してあります。この時、s = {51, 199, 100, 100, 50}になりました(最下段のiter=89の図に相当)。またその右の「クラスタ数の変化」が、クラスタ数の繰り返し回数に対する変化を示した図になります。求めるc(クラスタ数)は図中で赤の波線で示した位置になり、その時c = 5の結果になりました。


 クラスタリングの結果を、iter=4,45,89について示してあります。クラスタリングされた点は、クラスタごとに違った形の違った色で示してあります。分布の輪郭線は、p261のStep3から確率的に決定したθi=(μi, Λi-1)を使って描いています。最後のiter=89は、logvのグラフでlogvが最大値となる繰り返し数で、図中で赤の波線で示してあります。その時のc(クラスタ数)=5になります。(クラスタ数のグラフの赤の波線のクラスタ数)

initial_cut.png

    推定する共分散行列の分布


q_error_cut.pngc_number_cut.png


      事後確率の変化            クラスタ数の変化


fig1_cut.pngfig2_cut.png

             iter = 4(途中段階)         iter = 45(途中段階)

fig3_cut.png

        iter = 89(logvが最大)


by チイ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:学問

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。