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

How to handle kmeans when a cluster has zero elements in it

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

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

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

关于处理这个案例我有两个问题: (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]);
    }
}

提前致谢,

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

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

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