我发现这在使用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])
,那么第三个值z
在这里做什么呢?
什么是美白?
任何解释都表示赞赏.谢谢.
第一:
# 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)
然后它data
被传递给kmeans算法:
res, idx = vq.kmeans2(data, 3)
所以现在你可以看到它在3d空间中传递给算法的30个点,而令人困惑的部分是如何创建点集.