凸クラスタリング法の実験 [学問]
書籍、「続:わかりやすいパターン認識」の第10章p208にある凸クラスタリング法による実験を、実際にpythonで実装して確かめてみました。凸クラスタリングのアルゴリズムは、p206のもの(式(10.36)〜(10.45))を用いています。データは、前のEMアルゴリズムに使ったものと同じものを使っています。iter = 0の初期値は、書籍のものに合わせています。凸クラスタリングには、以下の様な特徴があります。
・ クラスタ数c を未知のまま推定する(メリット)
・ 凸計画問題なので、初期条件に依存せず、大域的最適解(最大点)となる(メリット)
・ 共分散行列σ2が全てのクラスタで等しく、かつ等方的であるという前提(デメリット)
・パラメータσ2は、恣意的に決める必要があり、直感に頼るしかない(デメリット)
凸クラスタリングの実験を、以下の2通りの方法で試してみた。式(10.32)のσ2はσ2 =1とした。なお、p208の図10.6の途中段階のグラフは今回は煩雑になるので掲載していません。一番最後のもの(final)だけを表示してあります。
・ノーマルケース
全ての500個の点の事前確率πiを最後まで愚直に計算した場合。iter=4000となった時点での、πi > 0.01 の条件で選別して、6個のセントロイドが抽出された。(0, 0)のクラスタが2個のセントロイドとなったので、そのセントロイドの相加平均を求めている。(相加平均を求めたクラスタのσ2 =1の等方的正規分布は輪郭線を太い黒で示してある。)図final_normalに示すように最終的なクラスタ数はc=5個になり、その最終的な事前確率は式(10.37)で再正規化を行ってπi= [0.396, 0.200, 0.205(注1), 0.100, 0.099] となった。真の値、[0.4, 0.2, 0.2, 0.1, 0.1] に近い値になっている。一方セントロイドPは、P[5][2] = [[-3.014, 2.960], [1.994, 4.030], [0.006, -0.013], [3.991, -2.054], [-2.009, -4.059]]となった。(図でセントロイド位置は赤点で示してある。)
・カットケース
予め定められた閾値(0.001/samples)以下となったπiは強制的に0に設定し、収束効率の改善を図ったもの。(ここで、samplesは、πi ≠ 0のπiの個数で500から徐々に減っていくが、削除される度に式(10.37)で正規化を行っている。これに合わせて、πi = 0のfik(p206のStep2の式)に対応する行も削除されていく。)最終的にiter=4000で、12個のセントロイドが抽出された。samples=12, fik = (12, 500)となった。(-3, 3)クラスタのセントロイドが4個、(0, 0)クラスタのセントロイドが4個、(-2, -4)クラスタのセントロイドが2個となったので、それぞれのクラスタのセントロイドの相加平均を求めた。(相加平均を求めたクラスタのσ2 =1の等方的正規分布は輪郭線を太い黒で示してある。)図final_cutに示すように最終的なクラスタ数はc=5個になり、その最終的な事前確率はπi = [0.395(注2), 0.199, 0.206(注2), 0.100, 0.100(注2)]となった。セントロイドPは、P[5][2] = [[-3.014, 2.960], [1.994, 4.030], [0.007, -0.011], [3.991, -2.054], [-2.008, -4.058]]となった。(図でセントロイド位置は赤点で示してある。)
(注1)(0, 0)のクラスタの2個の事前確率を足し算している。(0.1707 + 0.0340)
(注2)(-3, 3)、(0, 0)、(-2, 4)のクラスタの4個、4個、2個の事前確率をそれぞれ足し算している。
推定する共分散行列の分布
final_normal 対数尤度(normal)
final_cut 対数尤度(cut)
by チイ
コメント 0