入力にカスタム距離行列を使用したk-means実装


14

入力で距離行列を取ることができるk-means実装(matlabの方が良いでしょう)を誰かが指摘できますか?標準のmatlab実装では、入力に観測行列が必要であり、類似性の尺度をカスタム変更することはできません。


2
ユークリッド距離のマトリックスに対応する生データを生成し、それらをK-Meansに入力してみてください。別の簡単なアプローチは、マトリックスの階層的クラスタリングのWardメソッドを使用することです。K-MeansとWardは、クラスターとは何かという同様のイデオロギーを共有します。
ttnphns


Matlabではありませんが、Pythonのページ(指定できるのはあなた自身の距離関数を使用し、scikits-learn-k-meansの下にあります)は、scipy.spatialの20奇数のメトリックを使用できます。距離。
デニス

回答:


13

k-meansはクラスター化するポイントのさまざまなサブセットの平均を見つけることができる必要があるため、入力として距離行列をとるk-meansのバージョンを要求することは実際には意味がありません。

代わりにk-medoidを試すことができます。利用可能なmatlab実装いくつかあります。


1
こんにちは、答えてくれてありがとう。距離行列を直接与える代わりに、入力としてカスタム距離メトリックを与えることは可能でしょうか?ポイントは、2つのクラスタリング手法を比較する必要があり、2番目の手法ではカスタム類似度マトリックスを使用するため、公平な比較を行うためにkmeansで同じアプローチを使用することです。
エウジェニオ

2
ELKIでは、k-meansで任意の距離関数を使用できます。アルゴリズムが収束に失敗する可能性があることに注意してください。K-meansは、ユークリッド距離の2乗(平方和)に対して実際に設計されています。他の距離では、平均が最適化されなくなり、最終的にアルゴリズムは収束しなくなります。真剣に、k-medoidの使用を検討してください。実際には、任意の距離でk-meansアイデアを使用できるように書かれています。
QUITがあります--Anony-Mousse

カスタムメトリック関数を提供できるpython / C ++ライブラリのpyclusteringもあります:github.com/annoviko/pyclustering/issues/417
CpILL

7

距離のマトリックスを生データに変換し、K-Meansクラスタリングに入力できます。手順は次のとおりです。

1)N点間の距離は、2乗ユークリッド距離でなければなりません。マトリックスの「二重センタリング」を実行します。各要素から行平均を減算します。結果では、各要素の列の平均値を減算します。結果で、各要素に行列平均を追加します。マイナス2で除算します。現在のマトリックスは、Nポイントのクラウドの幾何学的中心に原点が置かれているポイント間のSSCP(平方和と外積のマトリックス)です。(ダブルセンタリングの説明はこちらご覧ください。)

2)そのマトリックスでPCA(主成分分析)を実行し、NxNコンポーネントのローディングマトリックスを取得します。その最後の列のいくつかはすべて0である可能性が高いため、それらを切り捨てます。あなたが今とどまっているのは、実際には主成分スコア、つまりクラウドを軸として通過する主成分へのNポイントの座標です。このデータは、K-Means入力に適した生データとして扱うことができます。

PS距離が幾何学的に正しい2乗ユークリッド距離ではない場合、問題が発生する可能性があります。SSCP行列が正(半)定でない場合があります。この問題はいくつかの方法で対処できますが、精度が失われます。


ご回答有難うございます!実際、オブジェクト間の実際の距離行列はありませんが、類似度行列(0 ... 1)があり、ユークリッド距離を使用して正確に計算されませんが、生データを考慮しますが、標準的な方法。この場合、私はあなたの手順を適用できないと思います、私は正しいですか?
エウジェニオ

類似性を距離に変換した後でも、引き続き可能です。後者はおそらく真のユークリッドではありません(したがって、SSCPには負の固有値があります)。次に、SSCPが負数を失うまで、距離に小さな定数を追加しようとします。eig。問題を回避する他の方法もあります。そして、二乗距離の中心行列を二重にすることを覚えておいてください。
ttnphns

PSそして、ところで。マトリックスが類似している場合、まあ、それはさらに良いです。あなたはそれを私が話していたSSCPマトリックスとして扱い、それでPCAを行います。それでも、負の固有値の可能性の問題は残っています。
ttnphns

@ttnphns、申し訳ありませんが、ステップ1の説明がありません。距離行列X(たとえばN * N)は対称になるのでcolMeans(X) =rowMeans(X) 、rowまたはcolを減算するとY=X-rowMeans(X)mean(Y)が0になります。
Zhubarb

1
@Zhubarb、私が言うときYou could turn your matrix of distances into raw data(ポイント1と2)、私は本質的に、トーガーソンの多次元スケーリング(MDS)を参照します。この手順については、このサイト(およびGoogleも検索)で検索してください。「二重センタリング」とは、点の雲の重心に配置された原点上で定義された対応するスカラー積行列への(平方)距離の変換です。
ttnphns

3

私の知り合いの一人が書いたこの記事をご覧ください;)

http://arxiv.org/abs/1304.6899

これは、一般化されたk-means実装に関するもので、入力として任意の距離行列を取ります。対角線がゼロの任意の対称非負行列にすることができます。奇妙な距離行列の場合、賢明な結果が得られない可能性があることに注意してください。プログラムはC#で書かれています。

上記のリンクにアクセスし、[その他の形式]、[ソースのダウンロード]の順にクリックすると、ソースコードを取得できます。次に、Program.csを含む.tar.gzを取得します。または、ソースコードをPDFからコピーすることもできます。


3

Java Machine Learning Libraryを使用できます。K-Meansを実装しています。コンストラクターの 1つは3つの引数を受け入れます

  1. K値。
  2. そのオブジェクトは、DistanceMeasureクラスのインスタンスです。
  3. 反復回数。

DistanceMeasureクラスを簡単に拡張して、目的の結果を得ることができます。考え方は、このクラスのmeasure(Instance x、Instance y)メソッドのカスタム距離マトリックスから値を返すことです。

K-Meansは、距離メトリックの特定のプロパティを想定して収束するように保証されます。ユークリッド距離、マンハッタン距離、または他の標準的なメトリックは、これらの仮定を満たします。カスタム距離メトリックはこれらの仮定を満たさない可能性があるため、コンストラクターには、クラスター化ツールを構築するために実行する反復回数を指定する3番目のパラメーターがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.