当集群中的元素为零时如何处理kmeans

Posted

技术标签:

【中文标题】当集群中的元素为零时如何处理kmeans【英文标题】:How to handle kmeans when a cluster has zero elements in it 【发布时间】:2019-03-23 22:55:12 【问题描述】:

我正在尝试在 Java 中实现 KMeans,但遇到了一个将我所有结果都抛出的案例。当给定一些随机选择的初始化质心时,当数据进入其中一个质心实际上并未定义集群的状态时,就会发生这种情况。例如,如果 K=3,可能是 2 个质心更接近所有数据点,在这种情况下,在该迭代期间,我将只有 2 个聚类而不是 3 个。

不过,据我了解 KMeans,当我们重置质心时,我们需要对每个集群的所有数据点求和,然后除以集群的大小(以获得平均值)。因此,这意味着我们将拥有一个大小为 0 的集群,并且我们的新质心将是

[0/0, 0/0, ... 0/0]

我有 2 个关于处理此案的问题: (1)如果我们失去了一个集群,我们怎么可能从中恢复? (2) 有什么方法可以解释除以 0 的原因吗?

我对这个逻辑的代码如下:

// do the sums
for (int i = 0; i < numDocuments; i++) 
    int value = label[i]; // get the document's label (i.e. 0, 1, 2)
    for (int j = 0; j < numWords; j++) 
        tempCentroids[value][j] += data[i][j];
    
    tally[value]++;


// get the average
for (int i = 0; i < k; i++) 
    for (int j = 0; j < numWords; j++) 
        tempCentroids[i][j] /= (double) tally[i]; // could have division by zero
        System.out.println("tally[i] for centroid " + k + " is " + tally[i]);
    

提前致谢,

【问题讨论】:

【参考方案1】:

“例如,如果 K=3,可能是 2 个质心更接近所有数据点,在这种情况下,在该迭代期间,我将只有 2 个聚类而不是 3 个”

我认为您始终可以将您为第三个集群选择的质心保持在第三个集群中,而不是在其他某个集群中。这样,您就可以保持集群的数量,并且不会遇到您提到的奇怪情况。 (我假设您选择随机质心作为数据集中的实际 K 个数据点)

您可能还想查看 K-means ++ 算法,该算法与 Kmeans 算法相同,但集群中心步骤的初始化除外。这将导致(可能)更好的分类。

【讨论】:

以上是关于当集群中的元素为零时如何处理kmeans的主要内容,如果未能解决你的问题,请参考以下文章

zk 节点宕机如何处理?

windows故障转移群集仲裁盘坏了如何处理?

sklearn.cluster.KMeans 如何处理缺少质心(可用质心小于 n_clusters)的 init ndarray 参数?

您通常如何处理数据库事务日志?

Hdfs的DN节点数据磁盘大小不均衡如何处理

当元素为 data-testid 时如何处理弹出“接受所有 cookie” - 在 Python 中使用 Selenium