对于R来说,我是一个新鲜的人,试图通过迭代调用相同数据集的k-均值例程和10/15倍的K值(我的情况下是k=3 ),来评估我是否能够得到K-均值的优化(使用R),看看是否能给出好的结果。在每次调用时,我都会看到集群的变化,即使是平方和也开始发生变化,但我不知道如何在最佳情况下停止。
有人能指引我吗?
代码:
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)
发布于 2020-03-29 13:47:12
我不确定我是否理解你的问题,因为这不是选择最佳分割的通常方法(肘法、剪影法等)。
假设您想要找到最小化群内平方和的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")
您可以编写它来重复运行,这意味着:
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)
但是,除非我误解了您的目标,否则这是选择性能最好的分区的一种奇怪方法。通常,这是被评估的集群的数量;而不是用相同的样本数据和相同的集群数产生的不同的部分。
从您的评论编辑
好的,那么您想要找到给您提供最佳性能的列的组合。下面我给你一个例子,每两个组合的三个变量被测试。您可以泛化一点(但是有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)
https://stackoverflow.com/questions/60914599
复制相似问题