当使用minit ='matrix'时,scipy的kmeans2算法是否还会权衡初始质心集?

时间:2016-12-14 22:47:14

标签: python algorithm numpy scipy k-means

我正在玩scipy的kmeans2算法,直到我发现了一个问题。请考虑以下代码:

x = np.array([[0.1, 0.0], [0.0, 0.1], [1.1, 1.0], [1.0, 1.1]])
c = np.array([[3,3], [4, 4]])

kmeans2(x, c, minit = 'matrix', iter=100)

您希望此代码(相当狡猾)只会收敛到具有以下质心的解决方案:[0.05, 0.05][1.05, 1.05]。 但是,代码返回:

 (array([[ 0.55,  0.55],
   [ 4.  ,  4.  ]]), array([0, 0, 0, 0], dtype=int32))

似乎k-means算法在找到新质心时会考虑其初始质心。为什么是这样?我怎样才能防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

我有一段时间没有真正研究过这个问题,但我随机得到了这个Eureka时刻,我想出了为什么我的问题出现了:
虽然结果看起来有点奇怪,但如果你看看k-means是如何工作的,这些结果实际上很容易解释:在k-means的第一个时期,四个数据点都被分配给[3, 3]质心,因为该质心最接近所有数据点。数据点的平均值为[ 0.55, 0.55]。无论你做了多少个时期,初始化为[3, 3]的质心将保持不变(因为它不被“吸引”到任何其他数据点,没有任何)和另一个质心(初始化为{{ 1}})将保持放置,因为没有数据点更接近这个质心而不是另一个。就是这样。