来自scipy.cluster.kmeans的不稳定结果

时间:2013-11-22 09:03:44

标签: python numpy scipy k-means

以下代码在每个运行时给出不同的结果,同时使用k均值方法将数据聚类为3个部分:

from numpy import array
from scipy.cluster.vq import kmeans,vq

data = array([1,1,1,1,1,1,3,3,3,3,3,3,7,7,7,7,7,7])
centroids = kmeans(data,3,100) #with 100 iterations
print (centroids)

获得的三个可能结果是:

(array([1, 3, 7]), 0.0)
(array([3, 7, 1]), 0.0)
(array([7, 3, 1]), 0.0)

实际上,计算出的k均值的顺序是不同的。但是,分配哪个k意味着哪个点属于哪个集群并不稳定?有什么想法??

2 个答案:

答案 0 :(得分:3)

来自the docs

k_or_guess: int or ndarray
  

要生成的质心数。为每个质心分配一个代码,该质心也是生成的code_book矩阵中质心的行索引。

     

通过随机选择观察结果选择初始k个质心

因此,簇的顺序是随机的。如果您想要更多控制,可以指定

  

或者,传递k by N数组指定初始k个质心

我不会在一般情况下推荐后者,因为不同的起始簇[可能]导致不同的聚类,并且预定义的初始质心可能导致次优解。

在您的简单情况下,生成的聚类始终是相同的(最佳)模群集顺序:

>>> centroids, _ = kmeans(data,3,100)
>>> idx, _  = vq(data, centroids)
>>> centroids, idx
array([1, 7, 3]), array([0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1])
>>> centroids, _ = kmeans(data,3,100)
>>> idx, _  = vq(data, centroids)
>>> centroids, idx
array([3, 7, 1]), array([2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1])

答案 1 :(得分:3)

那是因为如果你传递一个整数作为k_or_guess参数, k 初始质心是从输入观察集中随机选择的(这被称为Forgy method

来自the docs

  

k_or_guess int或ndarray

     

要生成的质心数。一个   代码分配给每个质心,也就是每个质心的行索引   生成的code_book矩阵中的质心。

     

最初的k质心   通过从观察中随机选择观察来选择   矩阵。或者,传递k乘N数组指定初始k   质心。

尝试改为猜测:

kmeans(data,np.array([1,3,7]),100)

# (array([1, 3, 7]), 0.0)
# (array([1, 3, 7]), 0.0)
# (array([1, 3, 7]), 0.0)