gpt4 book ai didi

java - 当簇中有零个元素时如何处理 kmeans

转载 作者:行者123 更新时间:2023-12-02 10:41:40 26 4
gpt4 key购买 nike

我正在尝试用 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 算法相同。这将导致(可能)更好的分类。

关于java - 当簇中有零个元素时如何处理 kmeans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52885746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com