入力で距離行列を取ることができるk-means実装(matlabの方が良いでしょう)を誰かが指摘できますか?標準のmatlab実装では、入力に観測行列が必要であり、類似性の尺度をカスタム変更することはできません。
入力で距離行列を取ることができるk-means実装(matlabの方が良いでしょう)を誰かが指摘できますか?標準のmatlab実装では、入力に観測行列が必要であり、類似性の尺度をカスタム変更することはできません。
回答:
k-meansはクラスター化するポイントのさまざまなサブセットの平均を見つけることができる必要があるため、入力として距離行列をとるk-meansのバージョンを要求することは実際には意味がありません。
距離のマトリックスを生データに変換し、K-Meansクラスタリングに入力できます。手順は次のとおりです。
1)N点間の距離は、2乗ユークリッド距離でなければなりません。マトリックスの「二重センタリング」を実行します。各要素から行平均を減算します。結果では、各要素の列の平均値を減算します。結果で、各要素に行列平均を追加します。マイナス2で除算します。現在のマトリックスは、Nポイントのクラウドの幾何学的中心に原点が置かれているポイント間のSSCP(平方和と外積のマトリックス)です。(ダブルセンタリングの説明はこちらをご覧ください。)
2)そのマトリックスでPCA(主成分分析)を実行し、NxNコンポーネントのローディングマトリックスを取得します。その最後の列のいくつかはすべて0である可能性が高いため、それらを切り捨てます。あなたが今とどまっているのは、実際には主成分スコア、つまりクラウドを軸として通過する主成分へのNポイントの座標です。このデータは、K-Means入力に適した生データとして扱うことができます。
PS距離が幾何学的に正しい2乗ユークリッド距離ではない場合、問題が発生する可能性があります。SSCP行列が正(半)定でない場合があります。この問題はいくつかの方法で対処できますが、精度が失われます。
X
(たとえばN * N)は対称になるのでcolMeans(X) =rowMeans(X)
、rowまたはcolを減算するとY=X-rowMeans(X)
、 mean(Y)
が0になります。
You could turn your matrix of distances into raw data
(ポイント1と2)、私は本質的に、トーガーソンの多次元スケーリング(MDS)を参照します。この手順については、このサイト(およびGoogleも検索)で検索してください。「二重センタリング」とは、点の雲の重心に配置された原点上で定義された対応するスカラー積行列への(平方)距離の変換です。
私の知り合いの一人が書いたこの記事をご覧ください;)
http://arxiv.org/abs/1304.6899
これは、一般化されたk-means実装に関するもので、入力として任意の距離行列を取ります。対角線がゼロの任意の対称非負行列にすることができます。奇妙な距離行列の場合、賢明な結果が得られない可能性があることに注意してください。プログラムはC#で書かれています。
上記のリンクにアクセスし、[その他の形式]、[ソースのダウンロード]の順にクリックすると、ソースコードを取得できます。次に、Program.csを含む.tar.gzを取得します。または、ソースコードをPDFからコピーすることもできます。
Java Machine Learning Libraryを使用できます。K-Meansを実装しています。コンストラクターの 1つは3つの引数を受け入れます
DistanceMeasureクラスを簡単に拡張して、目的の結果を得ることができます。考え方は、このクラスのmeasure(Instance x、Instance y)メソッドのカスタム距離マトリックスから値を返すことです。
K-Meansは、距離メトリックの特定のプロパティを想定して収束するように保証されます。ユークリッド距離、マンハッタン距離、または他の標準的なメトリックは、これらの仮定を満たします。カスタム距離メトリックはこれらの仮定を満たさない可能性があるため、コンストラクターには、クラスター化ツールを構築するために実行する反復回数を指定する3番目のパラメーターがあります。