まず:
# 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点だ、と紛らわしい部分は点の集合が作成された方法であることがわかります。
これは私の疑問です。私がしなければならない第3の値 'z'の使用は、2次元の点にk-meansを適用することです。しかし、ホワイトニングは、分散を正常化することに感謝します。私は今、その部分を取得します。おそらく 'z'、3番目の座標はポイントセットを明確に定義されたクラスターに分割するために使用され、プロットされたときに意味のあるクラスターが表示されます。 – kamalbanga
@kamalbanga、あなたがリンクしている例のポイントは、kmeansを3dポイントに適用することだと思います。 – askewchan