2013-11-28 11 views
5

私はthisのpythonでkmeans2アルゴリズムを使用する例を見つけました。私はpythonでscipyのkmeans2関数を使用する

# make some z vlues 
z = numpy.sin(xy[:,1]-0.2*xy[:,1]) 

# whiten them 
z = whiten(z) 

# let scipy do its magic (k==3 groups) 
res, idx = kmeans2(numpy.array(zip(xy[:,0],xy[:,1],z)),3) 

ポイントがzip(xy[:,0],xy[:,1])なので、3番目の値zはここで何をやっている、次の部分を取得することはできませんか?

また、ホワイトニングとは何ですか?

説明はありません。ありがとう。

答えて

9

まず:

# make some z vlues 
z = numpy.sin(xy[:,1]-0.2*xy[:,1]) 

このことについて奇妙な事は、それはと等価であるということです。それはそのように書かれている理由だから私は知らない

z = numpy.sin(0.8*xy[:, 1]) 

。おそらくタイプミスがありますか?

次に、ホワイトニング

# whiten them 
z = whiten(z) 

は単に母集団の分散を正規化されています。デモはこちらを参照してください:

>>> z = np.sin(.8*xy[:, 1])  # the original z 
>>> zw = vq.whiten(z)   # save it under a different name 
>>> zn = z/z.std()    # make another 'normalized' array 
>>> map(np.std, [z, zw, zn])  # standard deviations of the three arrays 
[0.42645, 1.0, 1.0] 
>>> np.allclose(zw, zn)   # whitened is the same as normalized 
True 

それが白化している理由それは私に明らかではありません。とにかく、に沿って移動:

# let scipy do its magic (k==3 groups) 
res, idx = kmeans2(numpy.array(zip(xy[:,0],xy[:,1],z)),3) 

は二つの部分にそれを破るのをしてみましょう:いずれの場合では

data = np.column_stack([xy, z]) 

を書くの奇妙な(と遅い)方法です

data = np.array(zip(xy[:, 0], xy[:, 1], z)) 

、あなたが開始しました2つの配列を使用して1つに統合します:

>>> xy.shape 
(30, 2) 
>>> z.shape 
(30,) 
>>> data.shape 
(30, 3) 

そして、それは関数kmeansアルゴリズムに渡されdataです:

res, idx = vq.kmeans2(data, 3) 

だから今、あなたはそれがアルゴリズムに渡され、3D空間での30点だ、と紛らわしい部分は点の集合が作成された方法であることがわかります。

+0

これは私の疑問です。私がしなければならない第3の値 'z'の使用は、2次元の点にk-meansを適用することです。しかし、ホワイトニングは、分散を正常化することに感謝します。私は今、その部分を取得します。おそらく 'z'、3番目の座標はポイントセットを明確に定義されたクラスターに分割するために使用され、プロットされたときに意味のあるクラスターが表示されます。 – kamalbanga

+0

@kamalbanga、あなたがリンクしている例のポイントは、kmeansを3dポイントに適用することだと思います。 – askewchan

関連する問題