我是R的新手,我已经使用hclust
训练了模型:
model=hclust(distances,method="ward”)
结果看起来不错:
现在我得到一些新的数据记录,我想预测它们每个属于哪个集群。我该如何完成它?
答案 0 :(得分:7)
群集不应该对新数据进行“分类”,顾名思义 - 它是分类的核心概念。
一些聚类算法(如基于质心的kmeans,kmedians等)可以根据创建的模型“标记”新实例。不幸的是,层次聚类不是其中之一 - 它不对输入空间进行分区,它只是“连接”聚类期间给出的一些对象,因此您无法将新点分配给此模型。
使用hclust进行“分类”的唯一“解决方案”是在hclust给出的标记数据之上创建另一个分类器。例如,您现在可以使用hclust中的标签对数据进行训练(即使k = 1),并使用它为新点分配标签。
答案 1 :(得分:1)
您可以使用此分类,然后使用LDA来预测新点应落入哪个类别。
答案 2 :(得分:0)
我面临类似的问题,并提出了临时解决方案。
hclust
给出了火车数据的标签。 同样,我们可以对特征使用PCA方法并提取PC1作为标签。
在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)
预测新数据
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()
答案 4 :(得分:-3)
为什么不计算每个hclust群集的点的质心,然后使用相同的距离函数将新点指定到最近的点?
类中的knn只会查看最接近的n并且只允许欧几里德距离。
没有必要运行分类器。