r - k 均值聚类后为新数据分配聚类的简单方法

标签 r k-means

我正在数据框 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")

flexclust plot

还有一些转换方法可以将 stats::kmeanscluster::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/

相关文章:

r - 如何在整个 data.frame 上使用条件并与向量进行比较?

r - 在 addmargins 函数上自定义 "Sum"标签

python - 虹膜数据在哪一部分接收到标记簇?

python - 为什么当我使用规范化数据时,我会在 kmeans 中得到嵌套簇,而当我使用非规范化数据时,我会得到非重叠簇?

r - R中大数据的轮廓计算

matlab - 使用隐马尔可夫模型的手势识别

R:条件格式化具有百分比(%)值的列

r - 如何使用移动窗口迭代 R 中的裁剪栅格?

python - Spark 使用 StandardScaler 获取实际的集群中心体

R 编程正态分布