k-means 聚类结果的可变性:之前设置 set.seed()?

机器算法验证 r
2022-03-24 18:02:33

然后我拟合线性模型,plot(n_clust, error)以确定我试图对我的数据执行 k-means 聚类的最佳组合(包含 2000 个案例和 10 个变量的矩阵)。我不知道我应该选择多少个集群。为了解决这个问题,我采用了设置不同 K 值的策略。错误结果和使用的簇数存储在两个向量中。

然后我拟合了线性模型,它给了我最大的 R 平方和。我使用这种策略来选择最佳 K 值。关键是我已经多次执行此过程,并注意到每次运行之间的误差向量不同。这给了我不同的最佳 K 值。使 k-means 结果“稳定”的替代方法是使用set.seed()函数先验kmean()但是,我担心结果尽管是固定的,但没有一致性。有人可以给我一些“线索”吗?set.seed()会不会只是后一个可变性?是否有另一种选择最佳 K 的策略?

谢谢!

n_clust=NULL
error=NULL
for(i in 1:200){
cl <- kmeans(scores, i, iter.max=100)
erro <- c(error,cl$tot.withinss)
n_clust <- c(n_clust,i)
}

r2=NULL
for(i in 3:197){
a <- lm(error[1:i] ~ n_clust[1:i])
b <- lm(error[i+1:200] ~ n_clust[i+1:200])
rsqd <- as.numeric(summary.lm(a)[8]) + as.numeric(summary.lm(b)[8])
r2 <- c(r2, rsqd)}

id_n <- 3 + which(r2==max(r2))
2个回答

你说这set.seed对你不起作用,但你的例子没有使用set.seed,所以很难知道你是否正确使用它!

这是一个接近你的例子,似乎有效:

scores <- matrix(runif(1000), 100, 10)

set.seed(42)
k1 = kmeans(scores, 5, iter.max=500)

set.seed(42)
k2 = kmeans(scores, 5, iter.max=500)

identical(k1, k2) # TRUE

...请注意,您需要在调用set.seed之前使用相同的种子进行调用kmeans,并且如果您希望获得相同的答案,则必须提供相同的参数。kmeans

centers当您为参数指定整数时,kmeans使用随机数来计算中心。如果您改为指定自己的中心,它应该是可重现的。在这里,我选择前 5 行作为中心(虽然可能是个坏主意):

k1 = kmeans(scores, scores[1:5,], iter.max=500)
k2 = kmeans(scores, scores[1:5,], iter.max=500)
identical(k1, k2) # TRUE

添加到汤米的答案中,要确定您的 k-means 集群的最佳 K 值,最好的方法是尝试肘部曲线,通过将您的内脏与您的 K 值绘制为您的肘部曲线并选择肘部处的值作为最佳 K价值。

https://stackoverflow.com/questions/6645895/calculating-the-percentage-of-variance-measure-for-k-means

https://www.r-bloggers.com/finding-optimal-number-of-clusters/