K-means 对相同数据迭代 10 次

K-means iterated for same data for 10 times

我是 R 的新手。尝试评估我是否可以通过针对相同数据集和相同 K 值(即 k=3)迭代调用 k-means 例程来优化 K-means(使用 R)在我的例子中)10/15 次,看看是否能给我好的结果。我看到聚类在每次调用时都会发生变化,甚至总平方和和 withinss 也开始发生变化,但不确定如何在最佳情况下停止。

有人可以指导我吗?

代码:

run_kmeans <- function(xtimes)
{

  for (x in 1:xtimes) 
    {
    kmeans_results <- kmeans(filtered_data, 3) 
    print(kmeans_results["totss"]) 
    print(kmeans_results["tot.withinss"])
  }   
  return(kmeans_results)
}
kmeans_results = run_kmeans(10)

不确定我理解你的问题,因为这不是 select 最佳分区的常用方法(肘部方法、轮廓方法等)

假设您想要找到最小化簇内平方和的 kmeans 分区。

让我们以?kmeans

中的例子为例
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")

您可以将其重复写入 运行 kmeans:

xtimes <- 10
kmeans <- lapply(seq_len(xtimes), function(i){
  kmeans_results <- kmeans(x, 3)
})

lapply 总是优于 for。你输出一个列表。提取内部并查看哪个是最小的:

perf <- sapply(kmeans, function(d) as.numeric(d["tot.withinss"]))
which.min(perf)

但是,除非我误解了您的 objective,否则这是 select 性能最高的分区的一种奇怪方式。通常,这是评估的集群数;使用相同的样本数据和相同数量的聚类产生的不同分区。

根据您的评论进行编辑

好的,所以您想找到能给您带来最佳性能的列组合。我在下面给你一个例子,其中测试了三个变量的每两个乘两个组合。你可以概括一点(但是8个变量可能的组合数量很大,你应该有一个例程来减少测试组合的数量)

x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 3),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 3)
)
colnames(x) <- c("x", "y","z")

combinations <- combn(colnames(x), 2, simplify = FALSE)
kmeans <- lapply(combinations, function(i){
  kmeans_results <- kmeans(x[,i], 3)
})

perf <- sapply(kmeans, function(d) as.numeric(d["tot.withinss"]))
which.min(perf)