【问题标题】:How does K-Means work when initial centroid locations far away from the data are selected?当最初的质心位置远离数据时,K-均值如何工作?
【发布时间】:2022-01-11 02:30:30
【问题描述】:

根据我对K-means聚类的理解,选择k,选择质心位置,分配样本,然后质心移动到样本的均值,直到不再移动。

所以在这个例子中,如果选择 3 个质心,位置分别为 (5,1)、(5,10) 和 (5,20),会发生什么?我希望所有样本都分配给(5,1)质心,然后将移动到数据的平均值(5,0),并且算法将以属于1个簇(其他质心)的所有样本终止不动,并且有 1 次迭代)。

但是,当我在 Python 中使用 KMeans 实现它时,它的行为不是这样的:

In [3]: xa = [1,2,3,4,5,6,7,8,9,10]
   ...: xb = [0,0,0,0,0,0,0,0,0,0]
   ...: 
   ...: data = pd.DataFrame({"Xa": xa, "Xb":xb}, columns=["Xa", "Xb"])
   ...: 
   ...: initial = np.array([[5,1], [5,10], [5,20]])
   ...: 
   ...: km = KMeans(n_clusters=3,init=initial, n_init=1, max_iter=1).fit(data)
   ...: print(km.cluster_centers_)
[[ 4.5  0. ]
 [10.   0. ]
 [ 9.   0. ]]

让算法在不限制迭代次数的情况下运行会导致以下结果,这对我来说也没有意义:

In [4]: km = KMeans(n_clusters=3,init=initial, n_init=1).fit(data)
   ...: print(km.cluster_centers_)
[[3.  0. ]
 [9.5 0. ]
 [7.  0. ]]

谁能在这里解释我的误解?

【问题讨论】:

标签: python machine-learning scikit-learn cluster-analysis k-means


【解决方案1】:

k-means 的总体目标是以这样的方式将数据细分为 k 个集群,即数据点与其指定集群的质心之间的距离之和尽可能小。不能保证迭代 k-means 算法会产生最小化这个总和的集群,但它的实现应该拒绝明显糟糕的解决方案。返回一些空集群显然不是最优的,因为在这种情况下,我们可以通过将非空集群细分为几个更小的集群来做得更好。

因此,k-means 算法的实现使用各种方法来避免空簇。 sklearn 使用的实现会在每个迭代步骤中检查是否生成了空簇。如果是这种情况,那么代码会选择离其集群中心最远的数据点,并将与空集群相对应的中心重新定位到这些最远的点。 sklearn源代码中执行此步骤的函数是_relocate_empty_clusters_dense_relocate_empty_clusters_sparse

【讨论】:

    猜你喜欢
    • 2014-06-05
    • 2017-11-04
    • 2017-09-24
    • 2021-03-31
    • 2014-07-21
    • 2015-03-21
    • 2019-05-14
    • 2018-12-20
    • 2020-04-19
    相关资源
    最近更新 更多