Java 当集群中没有元素时,如何处理kmeans

Java 当集群中没有元素时,如何处理kmeans,java,k-means,Java,K Means,我试图在Java中实现KMeans,但遇到了一个抛出所有结果的案例。当给定一些随机选择的初始化质心时,数据进入某个质心不实际定义集群的状态时,就会发生这种情况。例如,如果K=3,可能有2个质心更接近所有数据点,在这种情况下,在迭代过程中,我将只有2个簇,而不是3个簇 正如我所理解的KMeans一样,当我们重置质心时,我们需要将每个簇的所有数据点相加,然后除以簇的大小(以获得平均值)。因此,这意味着我们将有一个大小为0的簇,并将得到新的质心 [0/0, 0/0, ... 0/0] 关于处理这件事

我试图在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]);
    }
}
//求和
对于(int i=0;i
提前感谢,

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

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

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