我想了解^{}。在
由于在二维空间中分布了许多点,问题是将它们分组成簇。这个问题在阅读this question时引起了我的注意,我认为scipy.cluster.vq.kmeans将是一个好办法。在
以下是数据:
使用下面的代码,目标是获得25个簇中每个簇的中心点。在import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.vq import vq, kmeans, whiten
pos = np.arange(0,20,4)
scale = 0.4
size = 50
x = np.array([np.random.normal(i,scale,size*len(pos)) for i in pos]).flatten()
y = np.array([np.array([np.random.normal(i,scale,size) for i in pos]) for j in pos]).flatten()
plt.scatter(x,y, s=16, alpha=0.4)
#perform clustering with scipy.cluster.vq.kmeans
features = np.c_[x,y]
# take raw data to cluster
clusters = kmeans(features,25)
p = clusters[0]
plt.scatter(p[:,0],p[:,1], s=81, c="crimson")
# perform whitening (normalization to std) first
whitened = whiten(features)
clustersw = kmeans(whitened,25)
q = clustersw[0]*features.std(axis=0)
plt.scatter(q[:,0],q[:,1], s=25, c="gold")
plt.show()
结果如下:
红点表示没有增白的簇中心的位置,黄点表示使用增白的点。虽然它们是不同的,但主要的问题是它们显然不是都在正确的位置上。因为集群都是很好地分离的,我很难理解为什么这个简单的集群会失败。在
我读过this question,它报道了kmeans没有给出准确的结果,但答案并不是真正的statisfactory。将kmeans2与minit='points'一起使用的建议解决方案也不起作用;即kmeans2(features,25, minit='points')给出了与上述类似的结果。在
所以问题是,有没有一种方法可以用scipy.cluster.vq.kmeans来执行这个简单的聚类问题?如果是这样的话,我如何确保得到正确的结果呢。在