使用 agnes 进行层次聚类 - 如何砍树?

机器算法验证 r 大车 层次聚类
2022-04-02 01:18:11

我正在data.frame使用分类变量和度量变量

# example data
a <- as.factor(c("A","A","B","C","D","A","C","A","C","C"))
b <- rep(1:5,2)
c <- as.factor(c("elephant","elephant","cat","dog","cat","elephant",
                 "cat","elephant","dog","dog"))
df <- data.frame(a,b,c)

我对此示例数据进行了聚类分析

# Dissimilarity Matrix Calculation

library(cluster)

x <- daisy(df, metric = c("gower"),
    stand = FALSE, type = list())

# Hierarchical Clustering

z <- agnes(x, diss = inherits(x, "dist"), metric = "euclidean",
      stand = FALSE, method = "single", par.method,
      trace.lev = 0, keep.diss = TRUE)

并收到这个树状图

plot(z,  main="plotit", which.plot = 2)

树状图

  • 我怎么知道在哪里砍树?

我可以做类似的事情

cutree(z, k = 2, h=0.3)

但是为k和选择的值h完全是任意的。我在一个大型数据集上工作,我不能依赖我在这个例子的图中看到的信息?

  • 是否有确定聚类数量的启发式方法?
  • 是否有启发式方法来确定树的切割高度?
2个回答

胡森等人。(2010)提出了一个基于集群间惯性增益的经验标准(见本文第 3.2 节)。基本上,最佳簇数 q 是 q 簇与 q+1 簇的簇间差异增加显着小于 q-1 簇与 q 簇的簇间差异增加的簇。所以,它类似于在上面的图中识别一个高原,但它是自动的,你不必“猜测”。

不过,您应该记住,树状图的每个级别都对应于观察的有效分区,因此没有绝对的最佳解决方案。您要选择的最佳集群数量取决于您的任务。例如,当分层聚类用于异常值检测时,您希望请求大量聚类(在提供的示例中为 n/10,其中 n 是观察总数)。

学术研究文献对此有很多信息。

我发现更具可读性和更容易理解的是 N.Zumel 和 J.Mount 所著的“Practical Data science with R”一书中的第 8.1.3 节。

从第 186 页起

选择集群的数量

挑选集群有许多启发式方法和经验法则;给定的启发式方法在某些数据集上的效果会比其他数据集更好。如果可能的话,最好利用领域知识来帮助设置集群的数量。否则,请尝试各种启发式方法,也许还有一些不同的k值。

然后他们讨论“平方和内的总和”和“Calinski-Harabasz 指数”(使用 R 代码)

一种简单的启发式方法是计算不同 k 值的平方和 (WSS) 内的总和,并在曲线中寻找“肘部”。

...

聚类的 Calinski-Harabasz 指数是聚类间方差(本质上是所有聚类质心与数据集的大质心的方差)与总聚类内方差的比率...

在此处输入图像描述

但是还有更多的方法。查看(困难的)Coursera 数据挖掘课程聚类分析,第 3 周