私はMATLABでk-Meansクラスタリングアルゴリズムを作成し、に組み込まれているMATLABに対して試してみようと思いましたkmeans(X,k)
。
ただし、非常に簡単な4つのクラスターのセットアップ(図を参照)の場合、MATLAB kMeansは常に最適なソリューション(左)に収束するわけではなく、(右)に収束します。
私が書いたものも必ずしもそうとは限りませんが、組み込み関数がこのような簡単な問題を解決し、常に最適な解決策を見つけることができるべきではありませんか?
私はMATLABでk-Meansクラスタリングアルゴリズムを作成し、に組み込まれているMATLABに対して試してみようと思いましたkmeans(X,k)
。
ただし、非常に簡単な4つのクラスターのセットアップ(図を参照)の場合、MATLAB kMeansは常に最適なソリューション(左)に収束するわけではなく、(右)に収束します。
私が書いたものも必ずしもそうとは限りませんが、組み込み関数がこのような簡単な問題を解決し、常に最適な解決策を見つけることができるべきではありませんか?
@Alexandre C.が説明したように、K-meansアルゴリズムは初期クラスター重心位置に依存し、最適解に収束するという保証はありません。
あなたができる最善のことは、ランダムな開始点で実験を数回繰り返すことです。
MATLABの実装は、そのようなオプションを提供します。replicates
これは、クラスタリングをN回繰り返し、クラスター内のポイントから重心までの距離の合計が最も小さいものを選択します。オプションを使用して、最初の図心を選択する方法を制御することもstart
できます。
さらに、MATLABは、いくつかの距離測度(Euclidean、Manhattan、Cosineなど)の中から選択できるようにします。1つの優れたオプションemptyaction
を使用すると、反復中にクラスターが割り当てられたすべてのメンバーを失ったときに何が起こるかを制御できます。
しかし、本当の利点は、2フェーズのアルゴリズムを採用していることです。通常の割り当てと再計算の反復と、それに続くオンライン更新フェーズです。詳細については、ドキュメントページのアルゴリズムのセクションを必ずお読みください。
k-meansアルゴリズムは、クラスター中心の初期推定に非常に敏感です。同じ初期質量中心で両方のコードを試しましたか?
アルゴリズムは単純であり、実装とMatlabの実装の間に多くの違いがあるとは思えません。
私はそれを簡単な問題とは言いません。:)実際、「k-meansクラスタリング」に関するウィキペディアの記事は、計算の複雑さについてかなり暗い状況を示しています。
ランダムな再起動(最初の推測に依存)から解放したい場合、妥協点は「グローバルk-means」アルゴリズムです。紙とMATLABのコードはここにあります:http://lear.inrialpes.fr/~verbeek/software.php
「k-meansアルゴリズム」(つまり、ロイドのアルゴリズム)の特定の実行が思い付くソリューションには、おそらくがっかりすることがよくあります。これは、ロイドのアルゴリズムがしばしば悪い極小値でスタックするためです。
幸いなことに、ロイドはk-meansを解く1つの方法にすぎません。そして、ほとんどの場合、より良い極小値を見つけるアプローチがあります。
秘訣は、データポイントのクラスター割り当てを一度に1つずつ更新することです。n
各平均に割り当てられたポイントの数を数えることで、これを効率的に行うことができます。m
次のようにポイントを削除した後、クラスター平均を再計算できるx
ようにします。
m_new = (n * m - x) / (n - 1)
そして、以下を使用x
してクラスター平均に追加します。m
m_new = (n * m + x) / (n + 1)
もちろん、ベクトル化できないため、MATLABで実行するのは少し面倒ですが、他の言語ではそれほど悪くはありません。
可能な限り最高の極小値を取得することに本当に熱心であり、エグザンプラベースのクラスタリングを使用してもかまわない場合は、アフィニティの伝播を確認する必要があります。MATLABの実装は、Freyラボのアフィニティ伝播ページで入手できます。
K-Means ++は、1回の実行では問題を解決しませんが、N回実行すると(元のK-MeansアルゴリズムをN回実行する場合と比較して)より良い結果が得られる傾向があります。