我一直在玩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算法似乎考虑了它的初始质心。为什么会这样?我怎样才能防止这种情况发生?你知道吗
我已经有一段时间没有真正研究过这个问题了,但我随机得到了一个尤里卡时刻,在这个时刻我发现了问题产生的原因:
尽管结果看起来有点奇怪,但如果你看看k-means是如何工作的,这些结果实际上很容易解释:在k-means的第一个纪元中,四个数据点都被分配到
[3, 3]
质心,因为质心最接近所有数据点。数据点的平均值为[ 0.55, 0.55]
。不管你在之后做了多少个历元,初始化为[3, 3]
的质心将保持不变(因为它不会被任何其他数据点“吸引”,没有任何数据点),而另一个质心(初始化为[4, 4]
)将保持不变,因为没有一个数据点比另一个更接近这个质心。就这样。你知道吗相关问题 更多 >
编程相关推荐