2016-12-14 4 views
0

我正在玩scipy的kmeans2算法,直到我发现问题。请看下面的代码:当使用minit ='矩阵'时,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算法寻找新的重心发生时,其最初的重心考虑。为什么是这样?我怎样才能防止这种情况发生?

回答

0

我真的没有为此工作了一段时间,但我随机得到这个尤里卡时刻,我想通了,为什么我的问题是发生的历史:
虽然结果似乎有点儿奇怪,如果你看一下如何K-意味着作品,这些结果实际上很容易解释:在k-means的第一个时代,四个数据点全部分配给质心,因为该质心最接近所有数据点。数据点的平均值为[ 0.55, 0.55]。无论你做了多少个时代,初始化为[3, 3]的质心将保持不变(因为它没有被任何其他数据点'吸引',也没有任何),其他质心(初始化为[4, 4])将保持放置,因为没有一个数据点比另一个更接近这个质心。而已。