R:每次运行时聚类结果都不同

6
library(amap)
set.seed(5)
Kmeans(mydata, 5, iter.max=500, nstart=1, method="euclidean")

在'amap'包中运行数次,即使参数和种子值始终相同,每次运行Kmeans或其他聚类方法的聚类结果也是不同的。
我尝试在不同的包中使用另一个kmeans函数,但结果仍然相同...
实际上,我想要同时使用Weka和R,所以我也尝试了RWeka包中的SimpleKMeans,并且它总是给出相同的值。然而,问题是我不知道如何将SimpleKmeans中的聚类数据和聚类编号存储到R中,这让我卡住了...
无论如何,我该如何保持聚类结果始终相同?或者我该如何将SimpleKmeans中的聚类结果存储到R中?

2
你每次运行 Kmeans 都会重置种子吗?还是只有第一次?如果你每次都重置种子,那么每次得到的答案应该都是相同的。 - Greg
3个回答

10

你一定做错了什么。只要在每次调用Kmeans()之前设置种子,我每次运行以下代码都会得到可重复的结果:

library(amap)

out <- vector(mode = "list", length = 10)
for(i in seq_along(out)) {
    set.seed(1)
    out[[i]] <- Kmeans(iris[, -5], 3, iter.max=500, nstart=1, method="euclidean")
}

for(i in seq_along(out[-1])) {
    print(all.equal(out[[i]], out[[i+1]]))
}
最后一个for循环输出的是:
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE
[1] TRUE

表明结果每次都完全相同。


1
编辑代码示例以包括 library(amap) 和函数 Kmeans - Andrie
+1 展示了每次调用 Kmeans 时应如何使用 set.seed。 - Andrie
@Andrie 感谢您的编辑,将其更新为 Kmeans(),现在 OP 告诉我们它在哪里找到了。 - Gavin Simpson

5

提醒一下,K均值算法的结果对数据集中数据点的顺序敏感。如果你再次使用随机数据点运行正确的代码,则会获得不同的结果。


3

你设置了种子吗? set.seed(1)

每次K-Means初始化质心时,都会随机生成,需要种子来生成随机值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接