私は理解したいscipy.cluster.vq.kmeans
です。クラスタ分析にscipy kmeansを使用する
2次元空間に多くの点が分布しているため、問題はクラスタにグループ化することです。この問題は私の注目を集めてthis questionとなり、私はscipy.cluster.vq.kmeans
が行く方法だと思っていました。
、その目的は、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()
赤い点は、白化することなく、白化を有するものが使用されている黄色の点をクラスタの中心の位置をマークします。彼らは異なっているが、主要な問題は、明らかにすべてが正しい位置にないということである。クラスタはすべて分離されているため、この単純なクラスタリングが失敗する理由を理解するのは難しいです。
約kmeans
については、this questionと表示されていますが、正確な結果は得られませんが、答えは実際には統計的ではありません。 kmeans2
とminit='points'
を使用するための推奨される解決策はどちらも機能しませんでした。すなわちkmeans2(features,25, minit='points')
は、上記と同様の結果をもたらす。
scipy.cluster.vq.kmeans
でこの簡単なクラスタリングの問題を解決する方法はありますか?もしそうなら、どうすれば正しい結果を得ることができますか?
私は同じことをしていました(同じ質問からインスパイアされました)。 'kmer'の' iter'引数に大きな値を使い、 'iter = 800'と同じくらい高い値を使うことで、より信頼できる結果が得られました。そしてそれはそれを遅くします。 –
本当ですか? 'iter = 800'を使って私は同じことを大雑把に受け取ります。 [ここの画像](https://i.stack.imgur.com/SqKmp.png)。 – ImportanceOfBeingErnest
私のクラスタはあなたよりも高い分散を持っていました。私がクラスターを緊張させたとき、私はさらに「iter」を上げなければならなかった。私はちょうど 'iter = 2000'で十分ではなかったが、' iter = 10000'が期待される中心を見つけたという例を実行しました。 (私はこれが問題の大きな解決策であると言っているわけではありません;私はちょうど 'kmeans'を働かせるために必要なものを探っています。) –