当集群中包含零个元素时如何处理kmeans

时间:2018-10-19 04:02:49

标签: java k-means

我正在尝试用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 个答案:

答案 0 :(得分:1)

“例如,如果K = 3,则可能是2个质心更接近所有数据点,在这种情况下,在该迭代过程中,我将只有2个簇而不是3个簇” / em>

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

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