使用scipy kmeans进行聚类分析

时间:2017-06-20 18:28:57

标签: python numpy scipy cluster-analysis k-means

我想了解scipy.cluster.vq.kmeans

在2D空间中分布了许多点​​,问题是将它们分组成簇。这个问题引起了我的注意力this question,我认为scipy.cluster.vq.kmeans将会成为现实。

这是数据:
enter image description here

使用以下代码,目标是获得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()

结果如下:
enter image description here

红点表示聚类中心的位置没有白化,黄点表示使用白化的那些。虽然它们不同,但主要问题是它们显然并非都处于正确的位置。因为集群都是完全分离的,所以我很难理解为什么这个简单的集群失败了。

我看了this question报告kmeans没有给出准确的结果,但答案并不是真正令人满意的。将kmeans2minit='points'一起使用的建议解决方案也不起作用;即kmeans2(features,25, minit='points')给出与上述类似的结果。

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

1 个答案:

答案 0 :(得分:0)

在这样的数据上,美白并没有什么区别:你的x和y轴已经类似地缩放了。

K-means无法可靠地找到全局最优。它往往陷入局部最优。这就是为什么通常使用多次运行并保持最佳匹配,并尝试复杂的初始化过程,如k-means ++。