【问题标题】:How do I predict new data's cluster after clustering training data?对训练数据进行聚类后如何预测新的数据簇?
【发布时间】:2014-01-30 14:33:34
【问题描述】:

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

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

结果看起来不错:

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

【问题讨论】:

标签: r machine-learning cluster-analysis


【解决方案1】:

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

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

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

【讨论】:

  • 太棒了,knn 的想法值得一试。
【解决方案2】:

如前所述,您可以使用诸如 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()

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题并想出了一个临时解决方案。

      1. 在我的环境 R 中,函数 hclust 给出了训练数据的标签。
      2. 我们可以使用一种监督学习模型来重新连接标签和特征。
      3. 然后,我们在处理监督学习模型时只进行相同的数据处理。
      4. 如果我们面对一个二元分类模型,我们可以用KS值、AUC值等来看看这个聚类的表现。

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

      1. 为了对这个标签进行分箱,我们得到了一个适合分类的新标签。
      2. 以同样的方式,我们在处理分类模型时进行同样的处理。

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

      参考

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

      【讨论】:

        【解决方案5】:

        为什么不计算每个 hclust 簇的质心,然后使用相同的距离函数将新点分配给最近的点?

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

        无需运行分类器。

        【讨论】:

        • 因为层次聚类不会创建质心是明确定义的对象的聚类。您在这里与事实相去甚远,在这种情况下需要分类器,1nn(上面建议的)是最简单且可能足够的解决方案(它的代码甚至比您的建议更简单)并且它会起作用,而计算质心则不会。跨度>
        • 上述方法对kmeans更有效。关于 HCA,我想知道是否可以根据树状图的结果采用树分裂技术?
        猜你喜欢
        • 2020-07-26
        • 1970-01-01
        • 2018-07-27
        • 2020-10-26
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        相关资源
        最近更新 更多