scipy 的 kmeans2 算法在使用 minit='matrix' 时是否也会权衡初始质心集?
Does scipy's kmeans2 algorithm also weigh initial centroids set when using minit='matrix'?
我一直在研究 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]
。
但是,代码 returns this:
(array([[ 0.55, 0.55],
[ 4. , 4. ]]), array([0, 0, 0, 0], dtype=int32))
看起来 k-means 算法在寻找新的质心时考虑了它的初始质心。为什么是这样?我怎样才能防止这种情况发生?
我已经有一段时间没有真正研究过这个了,但我随机得到了这个灵光一现的时刻,在这个时刻我弄清楚了为什么会出现我的问题:
虽然结果看起来有点奇怪,但如果你看看 k-means 的工作原理,这些结果其实很容易解释:在 k-means 的第一个 epoch 中,四个数据点都被分配到 [3, 3]
质心,因为该质心最接近所有数据点。数据点的平均值为 [ 0.55, 0.55]
。无论你之后做了多少个纪元,初始化为 [3, 3]
的质心将保持不变(因为它不是 'attracted' 到任何其他数据点,没有任何)和另一个质心(初始化为[4, 4]
) 将保持不变,因为 none 个数据点比另一个更接近这个质心。就是这样。
我一直在研究 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]
。
但是,代码 returns this:
(array([[ 0.55, 0.55],
[ 4. , 4. ]]), array([0, 0, 0, 0], dtype=int32))
看起来 k-means 算法在寻找新的质心时考虑了它的初始质心。为什么是这样?我怎样才能防止这种情况发生?
我已经有一段时间没有真正研究过这个了,但我随机得到了这个灵光一现的时刻,在这个时刻我弄清楚了为什么会出现我的问题:
虽然结果看起来有点奇怪,但如果你看看 k-means 的工作原理,这些结果其实很容易解释:在 k-means 的第一个 epoch 中,四个数据点都被分配到 [3, 3]
质心,因为该质心最接近所有数据点。数据点的平均值为 [ 0.55, 0.55]
。无论你之后做了多少个纪元,初始化为 [3, 3]
的质心将保持不变(因为它不是 'attracted' 到任何其他数据点,没有任何)和另一个质心(初始化为[4, 4]
) 将保持不变,因为 none 个数据点比另一个更接近这个质心。就是这样。