2012-05-08 8 views
1

私はMatlabの通常のkmeansアルゴリズムを「距離」、「余弦」、「EmptyAction」、L2の正規化されたフィーチャマトリックスに「ドロップ」して使用しています。 Matlabが生成する出力は、単にk = 20、Cのすべての重心がNaNであっても、クラスタ1.00000にEVERYデータポイントを割り当てるだけです。これを引き起こしている可能性のあることについては誰にも何か提案がありますか?Matlab k-means cosineはすべてを1つのクラスタに割り当てます

マトリックスのレイアウトは([0,1、...、1,0,1]、[...]、[0,1、...、1,0,1])です。私はMatlabにファイルを渡す前に、Pythonのnumpy.linalg.normを使ってL2正規化を行った。これは私が関数kmeansを実行している正確な方法である:ここでは

m=importdata('matrix.txt'); 
data=m'; % transpose, because kmeans treats columns as features instead of rows 
[L, C]=kmeans(data, 20, 'Distance', 'cosine', 'EmptyAction', 'drop') 

は私の正規化されたデータセットのサンプルです:

10.3440804328 
12.6885775404 
15.5884572681 
15.9059737206 
17.4355957742 
17.0 
17.3493515729 
17.3205080757 
18.6279360102 
19.7230829233 
21.400934559 
22.0 
22.5831795813 
23.0 
24.0416305603 
25.2388589282 
26.8141753556 
22.5388553392 
9.2736184955 
13.5277492585 
15.2970585408 

すべてのヘルプや提案をいただければ幸いです。より多くの情報が必要なら私に知らせてください!

+0

kmeansはx-y座標のセットで動作しますが、行ごとに1つのフィーチャしか提供しません。データに関連する値がありますか? – Smash

+0

私はこの場合、彼は1つの機能しか持っていなかったと仮定していた – Matt

+0

おそらく1秒の2番目の列を追加しますか? – Smash

答えて

1

これは失敗する余弦距離です。sqEuclideanで動作します。私は余弦距離がより多くの情報を必要とすると思う、そうでなければあなたのデータセットに意味をなさない。

編集:ここでは少し曖昧ですが、私はあなたに同意します...しかし、Matlabのpdist関数のコサイン距離の定義は次のようになります: "点の間に含まれる角度の余弦ベクター)。

私は、角度を含める必要があります(私は次の列で推測しています)。しかし、それはその目的を破るようなものです。 cosine similarity もう一度編集する:「2つのベクトルの間に含まれる角度」を含む可能性が高いと思います。この場合、私は、コサインが2つ以上の列を処理することを期待していると思います。

また、すでにPythonには、いくつかの優れた機械学習ツールもあります。ここにはone I have usedがあります。 MILKもありますが、自分で使ったことはありません。

+0

私が知る限り、余弦を持つkmeansは単位ベクトルを入力として受け取りますか?例えば、これもまた知られているように、「球状k-means」のこの説明を参照してください。http://www.shi-zhong.com/papers/oskm_ijcnn05.pdf これ以上のアイデアはありますか? – Doa

+0

また、Sklearnにはkmeansがありますが、別の距離測定値を設定することはできませんか?ユークリッドAFAICTだけです。 – Doa

+1

pdist(data、 'cosine')を実行すると、すべてのデータに対してゼロの距離が計算されます。 Matlabの定義はあなたが期待しているものではありません。あなたのデータの隣に列を置くと、何かを得ることができますが、余弦距離に慣れていないので、何を期待するのか分かりません。 – Matt

関連する問題