Python 使用scipykmeans进行聚类分析

Python 使用scipykmeans进行聚类分析,python,numpy,scipy,cluster-analysis,k-means,Python,Numpy,Scipy,Cluster Analysis,K Means,我想了解 在二维空间中分布有许多点,问题是将它们分组成簇。阅读时我注意到了这个问题,我认为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

我想了解

在二维空间中分布有许多点,问题是将它们分组成簇。阅读时我注意到了这个问题,我认为
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()
结果如下所示:

红色圆点表示未经增白的簇中心的位置,黄色圆点表示使用增白的簇中心。虽然它们是不同的,但主要问题是它们显然都不在正确的位置。因为集群都是很好地分开的,所以我很难理解为什么这个简单的集群会失败

我读了一些关于
kmeans
的报告,这些报告没有给出准确的结果,但答案并不是真正的statisfactory。使用
kmeans2
minit='points'
的建议解决方案也不起作用;i、 e.
kmeans2(功能,25,minit='points')
给出了与上述类似的结果


所以问题是,有没有一种方法可以用
scipy.cluster.vq.kmeans
执行这个简单的集群问题?如果是这样,我将如何确保得到正确的结果

在这样的数据上,白化并没有什么区别:x轴和y轴的比例已经相似


K-means不能可靠地找到全局最优解。它往往陷入局部最优。这就是为什么经常使用多次运行并仅保持最佳拟合,以及尝试复杂的初始化过程(如k-means++)的原因。

我只是在做同样的事情(受相同问题的启发)。通过对
kmeans
iter
参数使用较大的值,我得到了更可靠的结果,该值高达
iter=800
。是的,这让它变慢了。真的吗?使用iter=800,我得到了大致相同的结果。我的簇的方差比你的高。当我收紧集群时,我不得不启动更多的
iter
。我刚刚运行了一个例子,其中
iter=2000
是不够的,但是
iter=10000
找到了预期的中心。(我并不是说这是一个很好的问题解决方案;我只是在探索如何让
kmeans
发挥作用。)好的,就上面的例子来说,使用iter=4000就可以做到这一点。如果你愿意的话,请随时提供答案。当然,了解将iter设置为10、50或10000背后的逻辑会更有趣,但我认为它仍然回答了这个问题。你能详细说明你所说的“复杂的初始化过程,如k-means++”是什么意思吗?Google for k-means++好的,对不起,我的意思是问题中给出的问题,实现k-means++的方法是什么?是否有一个scipy函数来执行此操作?我需要换成scikit learn或其他图书馆吗?因此,这个问题的答案是,仅使用scipy工具是不可能的吗?您需要理解这个问题,而不仅仅是找到一个有时更好,有时不更好的功能/选项。