使用scipy';python中的s kmeans2函数
我找到了在python中使用kmeans2算法的示例。我看不到下面的部分使用scipy';python中的s kmeans2函数,python,scipy,k-means,Python,Scipy,K Means,我找到了在python中使用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]),那么第三个
# 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
在这里做什么呢
还有什么是美白
如有任何解释,我们将不胜感激。谢谢。首先:
# make some z vlues
z = numpy.sin(xy[:,1]-0.2*xy[:,1])
最奇怪的是,它相当于:
z = numpy.sin(0.8*xy[:, 1])
所以我不知道为什么它是这样写的。也许有打字错误
其次,
白化只是使总体方差正常化。请参见此处以获取演示:
>>> 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)
然后是传递给kmeans算法的数据
:
res, idx = vq.kmeans2(data, 3)
现在你可以看到,在3d空间中有30个点被传递给了算法,而令人困惑的是点集是如何创建的。这就是我的疑问所在,当我所要做的就是对2D点应用k均值时,第三个值
z
有什么用。然而,感谢的增白是方差的正常化
。我现在明白了。可能是z
,第三个坐标用于将点集划分为定义良好的簇,以便我们在绘制时看到一些有意义的簇。@kamalbanga,我认为您链接的示例的要点是将kmeans应用于三维点。
res, idx = vq.kmeans2(data, 3)