2017-06-20 8 views
1

私は理解したいscipy.cluster.vq.kmeansです。クラスタ分析にscipy kmeansを使用する

2次元空間に多くの点が分布しているため、問題はクラスタにグループ化することです。この問題は私の注目を集めてthis questionとなり、私はscipy.cluster.vq.kmeansが行く方法だと思っていました。

これはデータである:次のコードを使用して
enter image description here

、その目的は、25個のクラスタの各々の中心点を取得することであろう。

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.cluster.vq import vq, kmeans, whiten 

pos = np.arange(0,20,4) 
scale = 0.4 
size = 50 
x = np.array([np.random.normal(i,scale,size*len(pos)) for i in pos]).flatten() 
y = np.array([np.array([np.random.normal(i,scale,size) for i in pos]) for j in pos]).flatten() 


plt.scatter(x,y, s=16, alpha=0.4) 


#perform clustering with scipy.cluster.vq.kmeans 
features = np.c_[x,y] 

# take raw data to cluster 
clusters = kmeans(features,25) 
p = clusters[0] 
plt.scatter(p[:,0],p[:,1], s=81, c="crimson") 

# perform whitening (normalization to std) first 
whitened = whiten(features) 
clustersw = kmeans(whitened,25) 
q = clustersw[0]*features.std(axis=0) 
plt.scatter(q[:,0],q[:,1], s=25, c="gold") 

plt.show() 

結果は次のようになります
enter image description here

赤い点は、白化することなく、白化を有するものが使用されている黄色の点をクラスタの中心の位置をマークします。彼らは異なっているが、主要な問題は、明らかにすべてが正しい位置にないということである。クラスタはすべて分離されているため、この単純なクラスタリングが失敗する理由を理解するのは難しいです。

kmeansについては、this questionと表示されていますが、正確な結果は得られませんが、答えは実際には統計的ではありません。 kmeans2minit='points'を使用するための推奨される解決策はどちらも機能しませんでした。すなわちkmeans2(features,25, minit='points')は、上記と同様の結果をもたらす。

scipy.cluster.vq.kmeansでこの簡単なクラスタリングの問題を解決する方法はありますか?もしそうなら、どうすれば正しい結果を得ることができますか?

+2

私は同じことをしていました(同じ質問からインスパイアされました)。 'kmer'の' iter'引数に大きな値を使い、 'iter = 800'と同じくらい高い値を使うことで、より信頼できる結果が得られました。そしてそれはそれを遅くします。 –

+0

本当ですか? 'iter = 800'を使って私は同じことを大雑把に受け取ります。 [ここの画像](https://i.stack.imgur.com/SqKmp.png)。 – ImportanceOfBeingErnest

+1

私のクラスタはあなたよりも高い分散を持っていました。私がクラスターを緊張させたとき、私はさらに「iter」を上げなければならなかった。私はちょうど 'iter = 2000'で十分ではなかったが、' iter = 10000'が期待される中心を見つけたという例を実行しました。 (私はこれが問題の大きな解決策であると言っているわけではありません;私はちょうど 'kmeans'を働かせるために必要なものを探っています。) –

答えて

0

このようなデータでは、ホワイトニングは違いにはなりません。x軸とy軸はすでに同様にスケーリングされています。

K-meansは、大域最適を確実に見つけることができません。それは局所的な最適状態に陥る傾向があります。そのため、複数の実行を使用し、最適なものだけを保持し、k-means ++のような複雑な初期化手順を試すことが一般的です。

+0

"k-means ++のような複雑な初期化手順"の意味を詳しく説明できますか? – ImportanceOfBeingErnest

+0

Google for k-means ++ –

+0

申し訳ありませんが、私が意味するのは、問題から与えられたものです.k-means ++を実装する方法は何でしょうか?それを行うためのscipy機能はありますか? scikit-learnや他の図書館に変更する必要がありますか?質問に対する答えは、scipyツールだけでは不可能であるということでしょうか? – ImportanceOfBeingErnest

関連する問題