我正在数据框 df1 上运行 k 均值聚类,并且正在寻找一种简单的方法来计算新数据框 df2(具有相同变量名称)中每个观察值的最近聚类中心。将 df1 视为训练集,df2 视为测试集;我想在训练集上进行聚类,并将每个测试点分配给正确的聚类。
我知道如何使用 apply
函数和一些简单的用户定义函数来执行此操作(之前有关该主题的帖子通常提出类似的内容):
df1 <- data.frame(x=runif(100), y=runif(100))
df2 <- data.frame(x=runif(100), y=runif(100))
km <- kmeans(df1, centers=3)
closest.cluster <- function(x) {
cluster.dist <- apply(km$centers, 1, function(y) sqrt(sum((x-y)^2)))
return(which.min(cluster.dist)[1])
}
clusters2 <- apply(df2, 1, closest.cluster)
但是,我正在为一门类(class)准备这个聚类示例,其中学生不熟悉 apply
函数,因此我更希望能够使用内置函数将聚类分配给 df2在功能上。有没有方便的内置函数来查找最近的簇?
最佳答案
您可以使用flexclust包,其中有一个已实现的 k-means 预测方法:
library("flexclust")
data("Nclus")
set.seed(1)
dat <- as.data.frame(Nclus)
ind <- sample(nrow(dat), 50)
dat[["train"]] <- TRUE
dat[["train"]][ind] <- FALSE
cl1 = kcca(dat[dat[["train"]]==TRUE, 1:2], k=4, kccaFamily("kmeans"))
cl1
#
# call:
# kcca(x = dat[dat[["train"]] == TRUE, 1:2], k = 4)
#
# cluster sizes:
#
# 1 2 3 4
#130 181 98 91
pred_train <- predict(cl1)
pred_test <- predict(cl1, newdata=dat[dat[["train"]]==FALSE, 1:2])
image(cl1)
points(dat[dat[["train"]]==TRUE, 1:2], col=pred_train, pch=19, cex=0.3)
points(dat[dat[["train"]]==FALSE, 1:2], col=pred_test, pch=22, bg="orange")
还有一些转换方法可以将 stats::kmeans
或 cluster::pam
等集群函数的结果转换为 kcca
类的对象> 反之亦然:
as.kcca(cl, data=x)
# kcca object of family ‘kmeans’
#
# call:
# as.kcca(object = cl, data = x)
#
# cluster sizes:
#
# 1 2
# 50 50
关于r - k 均值聚类后为新数据分配聚类的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20621250/