PRML9章のK-meansをPythonで実装してみます。データx_nをあらかじめ指定したK個のクラスタにわけることを考えます。各クラスタの重心をμ_kとします。K個のデータ平均(means)=重心があるからK-meansですね。2値指示変数r_nkを用意します。これは、データ点x_nがk番目のクラスタに含まれるとき1、それ以外は0になります。各データx_nはただ1つのクラスタに属するという仮定があるためr[n]のK次元ベクトルは1つだけ1であとは0になります。このとき、最小化したい目的関数Jは(9.1)で与えられます。上の式は各データ点x_nからその点が所属するクラスタの重心までの距離を最小化することを意味しています。ここでの目的は、Jを最小にするr_nkとμ_kを求めることです。r_nkとμ_kの2つともわからないので、r_nkとμ_kをそれぞれ最適化する2つのステップを交互に何度も繰り返す手続きで求めようというのがミソのようです。現在のr_nkの値を用いてJを最小化するμ_kを求める(Mステップに対応)r_nkとμ_kは上のループを回すとJを最小かする最適解に収束していく。r_nkは各データ点がどのクラスタに属するかを表す潜在変数、μ_kが推定すべきパラメータと考えるEMアルゴリズムに対応するのだろうと理解しました。次の混合モデルでも各データ点がどのガウス分布から出たかを表すzを潜在変数としたモデルになっています。K-meansでは、r_nkが事後分布ではないし、Jも尤度関数ではないので厳密にはEMアルゴリズムとは言わないのかも。解くと(9.2)が得られます。(3)を解くと(9.4)が得られます。Pythonでプログラミングしてみます。PRMLの原著サポートページのfaithful.txtというデータを使うので同じフォルダにおいてください。show()収束判定は、目的関数Jの変化が0.01より小さくなったらにしています。46.4756638583のようにループが進むごとに小さくなっていき収束するのがわかります。クラスタ数K=2、K=3、K=4で実行すると下のようになります。クラスタ重心のμの初期値によって違う結果になります。自分で実装しなくても、SciPyのscipy.cluster.vq.kmeans()関数を使うことでより簡単にクラスタリングできます。VQ)とは、ベクトルで表...2010-05-21混合ガウスモデルとEM今回は、9.2の混合ガウス分布のところです。混合ガウス分布はK...2010-05-02非線形SVM今回は、非線形サポートベクトルマシンを試してみます。今回は、ロジスティック回帰です。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。