如何在对训练数据进行聚类后预测新数据的群集?

时间:2014-01-11 15:48:13

标签: r machine-learning cluster-analysis

我是R的新手,我已经使用hclust训练了模型:

 model=hclust(distances,method="ward”)

结果看起来不错:

enter image description here

现在我得到一些新的数据记录,我想预测它们每个属于哪个集群。我该如何完成它?

5 个答案:

答案 0 :(得分:7)

群集不应该对新数据进行“分类”,顾名思义 - 它是分类的核心概念。

一些聚类算法(如基于质心的kmeans,kmedians等)可以根据创建的模型“标记”新实例。不幸的是,层次聚类不是其中之一 - 它不对输入空间进行分区,它只是“连接”聚类期间给出的一些对象,因此您无法将新点分配给此模型。

使用hclust进行“分类”的唯一“解决方案”是在hclust给出的标记数据之上创建另一个分类器。例如,您现在可以使用hclust中的标签对数据进行训练(即使k = 1),并使用它为新点分配标签。

答案 1 :(得分:1)

您可以使用此分类,然后使用LDA来预测新点应落入哪个类别。

答案 2 :(得分:0)

我面临类似的问题,并提出了临时解决方案。

  1. 在我的环境R中,函数hclust给出了火车数据的标签。
  2. 我们可以使用一种监督学习模型来重新连接标签和特征。
  3. 然后,当我们处理监督学习模型时,我们只是进行相同的数据处理。
  4. 如果面对二进制分类模型,则可以使用KS值,AUC值等来查看此聚类的性能。

同样,我们可以对特征使用PCA方法并提取PC1作为标签。

  1. 要对该标签进行分类,我们将获得一个适合分类的新标签。
  2. 以同样的方式,当我们处理分类模型时,我们进行相同的处理。

在R中,我发现PCA方法处理比hclust快得多。 (Mayank 2016年) 在实践中,我发现这种方式很容易部署模型。 但是我怀疑这种暂时的解决方案是否会导致预测偏差。

参考

玛雅克。 2016年。“大型数据集上R中的Hclust()。”堆栈溢出。 hclust() in R on large datasets

答案 3 :(得分:0)

如前所述,您可以使用分类器(例如class :: knn)来确定新个体所属的集群。

KNN或k最近邻算法是最简单的机器学习算法之一,并且是基于实例的学习的示例,其中基于存储的,标记的实例对新数据进行分类。更具体地,借助于某种相似性度量来计算所存储的数据与新实例之间的距离。这种相似性度量通常由诸如欧几里得距离之类的距离度量表示。

接下来,我将代码作为虹膜数据的示例。

library(scorecard)
library(factoextra)
library(class)

df_iris <- split_df(iris, ratio = 0.75, seed = 123)
d_iris <- dist(scale(df_iris$train[,-5]))

hc_iris <- hclust(d_iris, method = "ward.D2")
fviz_dend(hc_iris, k = 3,cex = 0.5,k_colors = c("#00AFBB","#E7B800","#FC4E07"),
          color_labels_by_k = TRUE, ggtheme = theme_minimal())
groups <- cutree(hc_iris, k = 3)
table(groups)

enter image description here

预测新数据

knnClust <- knn(train = df_iris$train[,-5], test = df_iris$test[,-5] , k = 1, cl = groups)
knnClust
 [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 2 3 3 3 2 2 2 2 2 3 3 2 2 3 2 2 2 2 2 2 2 2 2
Levels: 1 2 3

# p1 <- fviz_cluster(list(data = df_iris$train[,-5], cluster = groups), stand = F) + xlim(-11.2,-4.8) + ylim(-3,3) + ggtitle("train")
# p2 <- fviz_cluster(list(data = df_iris$test[,-5], cluster = knnClust),stand = F) + xlim(-11.2,-4.8) + ylim(-3,3) + ggtitle("test")
# gridExtra::grid.arrange(p1,p2,nrow = 2)

pca1 <- data.frame(prcomp(df_iris$train[,-5], scale. = T)$x[,1:2], cluster = as.factor(groups), factor = "train")
pca2 <- data.frame(prcomp(df_iris$test[,-5], scale. = T)$x[,1:2], cluster = as.factor(knnClust), factor = "test")
pca <- as.data.frame(rbind(pca1,pca2))

绘制训练和测试数据

ggplot(pca, aes(x = PC1, y = PC2, color = cluster, size = 1, alpha = factor)) +
  geom_point(shape = 19) + theme_bw()

enter image description here

答案 4 :(得分:-3)

为什么不计算每个hclust群集的点的质心,然后使用相同的距离函数将新点指定到最近的点?

类中的knn只会查看最接近的n并且只允许欧几里德距离。

没有必要运行分类器。