我对R较新。尝试通过针对相同的数据集和相同的K值重复调用k-means例程来评估是否可以通过使用R来获得K-means的优化(即我的情况下k = 3 )的10/15倍,看看是否能给我带来良好的效果。我看到每次调用时群集都会发生变化,即使平方和之和的总和也开始发生变化,但不确定如何在最佳情况下停止运行。
有人可以引导我吗?
代码:
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)
不确定我是否理解您的问题,因为这不是选择最佳分区的常用方法(弯头方法,轮廓方法等)
假设您要找到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)
但是,除非我误解了您的目标,否则这是选择性能最高的分区的奇怪方法。通常,这是要评估的簇数;使用相同的样本数据和相同数量的聚类产生的partititon没有差异。
确定,因此您希望找到可以提供最佳性能的列组合。我在下面给出一个示例,其中每三个两个变量的两个两个组合进行测试。您可以概括一下(但是可以使用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)