2013-11-28 57 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]),那麼什麼是在這裏做第三值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.array(zip(xy[:, 0], xy[:, 1], z)) 

這是寫

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

在任何情況下的怪異(慢)的方式,你開始與兩個陣列合併成一個:

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

然後,它傳遞給k均值算法data

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

所以,現在你可以看到,它在三維空間中的30分被傳遞到算法和混亂的部分是點的集合如何創建。

+0

這就是我的疑問,當我所要做的就是將k-means應用於2D點時,第三個值「z」的用法是什麼。但是,感謝'白化正常化方差'。我現在得到那部分。也許'z',第三個座標用於將點集劃分成定義良好的聚類,以便在繪製時看到一些有意義的聚類。 – kamalbanga

+0

@kamalbanga,我認爲你鏈接的例子的要點是將kmeans應用於3d點。 – askewchan