层次聚类:确定最佳聚类数并统计描述聚类

Posted

技术标签:

【中文标题】层次聚类:确定最佳聚类数并统计描述聚类【英文标题】:Hierarchical Clustering: Determine optimal number of cluster and statistically describe Clusters 【发布时间】:2012-10-26 07:27:40 【问题描述】:

我可以对 R 中的方法使用一些建议来确定最佳聚类数,然后用不同的统计标准描述聚类。我是 R 新手,对聚类分析的统计基础有基本的了解。

    确定聚类数量的方法: 在文献中,一种常用的方法是所谓的“肘部标准”,它比较平方差和 (SSD)不同的集群解决方案。因此,SSD 是根据分析中的集群数量绘制的,并且通过识别图中的“肘部”来确定最佳集群数量(例如这里:https://en.wikipedia.org/wiki/File:DataClustering_ElbowCriterion.JPG) 这种方法是获得主观印象的第一种方法。因此我想在 R 中实现它。互联网上关于这方面的信息很少。这里有一个很好的例子:http://www.mattpeeples.net/kmeans.html,作者还做了一个有趣的迭代方法来查看在多次重复聚类过程后肘部是否稳定(尽管它是用于划分聚类方法而不是分层)。 文献中的其他方法包括所谓的“停止规则”。 MILLIGAN & COOPER 在他们的论文“An 检查用于确定数据集中聚类数量的程序”(可在此处获得:http://link.springer.com/article/10.1007%2FBF02294245)中比较了其中 30 条停止规则,发现 Calinski 和 Harabasz 的停止规则提供了最好的结果蒙特卡洛评估。在 R 中实现这一点的信息甚至更少。 因此,如果有人曾经实施过这个或另一个停止规则(或其他方法),一些建议会非常有帮助。

    统计描述集群:为了描述集群,我想到了使用均值和某种方差标准。我的数据是关于农业用地的,显示了每个城市不同作物的产量。我的目标是在我的数据集中找到类似的土地利用模式。

我为对象子集制作了一个脚本来进行第一次测试运行。它看起来像这样(脚本中的步骤说明,以下来源)。

    #Clusteranalysis agriculture

    #Load data
    agriculture <-read.table ("C:\\Users\\etc...", header=T,sep=";")
    attach(agriculture)

    #Define Dataframe to work with
    df<-data.frame(agriculture)

    #Define a Subset of objects to first test the script
    a<-df[1,]
    b<-df[2,]
    c<-df[3,]
    d<-df[4,]
    e<-df[5,]
    f<-df[6,]
    g<-df[7,]
    h<-df[8,]
    i<-df[9,]
    j<-df[10,]
    k<-df[11,]
    #Bind the objects
    aTOk<-rbind(a,b,c,d,e,f,g,h,i,j,k)

    #Calculate euclidian distances including only the columns 4 to 24
    dist.euklid<-dist(aTOk[,4:24],method="euclidean",diag=TRUE,upper=FALSE, p=2)
    print(dist.euklid)

    #Cluster with Ward
    cluster.ward<-hclust(dist.euklid,method="ward")

    #Plot the dendogramm. define Labels with labels=df$Geocode didn't work
    plot(cluster.ward, hang = -0.01, cex = 0.7)

    #here are missing methods to determine the optimal number of clusters

    #Calculate different solutions with different number of clusters
    n.cluster<-sapply(2:5, function(n.cluster)table(cutree(cluster.ward,n.cluster)))
    n.cluster

    #Show the objects within clusters for the three cluster solution
    three.cluster<-cutree(cluster.ward,3)
    sapply(unique(three.cluster), function(g)aTOk$Geocode[three.cluster==g])

    #Calculate some statistics to describe the clusters
    three.cluster.median<-aggregate(aTOk[,4:24],list(three.cluster),median)
    three.cluster.median
    three.cluster.min<-aggregate(aTOk[,4:24],list(three.cluster),min)
    three.cluster.min
    three.cluster.max<-aggregate(aTOk[,4:24],list(three.cluster),max)
    three.cluster.max
    #Summary statistics for one variable
    three.cluster.summary<-aggregate(aTOk[,4],list(three.cluster),summary)
    three.cluster.summary

    detach(agriculture)

来源

http://www.r-tutor.com/gpu-computing/clustering/distance-matrix How to apply a hierarchical or k-means cluster analysis using R? http://statistics.berkeley.edu/classes/s133/Cluster2a.html

【问题讨论】:

您可能想看一下由 Borcard、Gillet 和 Legendre 撰写的 Numerical Ecology with R,其中有一章很好地介绍了聚类分析:springer.com/statistics/life+sciences,+medicine+%26+health/book/… 我刚从我们的图书馆订购了这本书的副本,我会看一看。谢谢你的建议!...我必须承认,我觉得很奇怪有很多关于如何执行聚类分析的手册,而关于如何实际处理结果的手册很少:/ 在我看来,这是因为知道如何执行 CA 的人比了解结果的人多得多!如果你喜欢这本书,你可能还想看看 Legendre 和 Legendre Numerical Ecology,它不是 R 特定的,但非常通用和权威。 @Drew Steen 再次感谢您对文献的建议。我刚收到这本书,它提供了很多有趣的方法来加深聚类分析和绘制不同之处。当我度过难关时,我会尝试发布解决方案。 我在其他地方回答了一个关于上述第 1 部分的问题:***.com/a/15376462/1036500 【参考方案1】:

链接中显示的肘部标准适用于 k-means。此外,聚类均值显然与 k-means 相关,不适用于链接聚类(尤其不适用于单链接,请参阅单链接效应)。

但是,您的问题标题提到了层次聚类,您的代码也是如此吗?

请注意,肘部标准不会选择最佳聚类数。它选择 k-means 聚类的最佳数量。如果您使用不同的聚类方法,则可能需要不同数量的聚类。

没有客观上最好的聚类。因此,也没有客观上最好的集群数量。 k-means 有一个经验法则,即在集群数量和最小化目标函数之间选择(也许是最好的)折衷(因为增加集群的数量总是可以改善目标函数);但这主要是为了解决 k-means 的缺陷。这绝不是客观的。

聚类分析本身并不是一项客观的任务。聚类可能在数学上很好,但没用。聚类在数学上的得分可能要差得多,但它可能为您提供对数据的洞察,而这些数据无法通过数学来衡量。

【讨论】:

感谢您的回答。我认为它突出了聚类分析中的一些要点。我完全同意你的观点,没有客观上最好的聚类这样的东西。聚类方法在很大程度上是主观的,事实上我并不是在寻找一种客观的方法来解释聚类方法的结果。我正在/正在寻找一种稳健的方法来确定 R 中层次聚类中的最佳聚类数,以最好地代表我的数据结构。我认为这是聚类分析中的一个棘手点,因为正如你提到的,总是有一堆...... ...可能的解决方案。因此,除了经验解释之外,一些统计指标可用于根据集群内部的同质性和它们之间的异质性来确定大量的集群。基于 SSD 的 Elbow 准则不一定与 k-means 算法相关联。 Ward-Clustering 也是基于最小化 Clusters 中的 SSD(不同之处在于该任务以分层方式执行)。因此,SSD 中的弯头可以指示大量同质集群,其中 SSD 在集群内部仍然较低而在集群之间较高。 对于层次聚类,常用的方法是查看树状图。仅仅固定目标簇数并不能让您选择在不同深度进行切割。目视检查在这里有很大帮助。 如果我理解正确的话,而不是查看树状图并根据集群数量绘制 SSD 是完全一样的,不是吗?锁定我的树状图的问题是,我有太多的对象,以至于我的树状图太长了,看不到任何东西。也许你有一个建议如何以更高的分辨率绘制它(我对 R 很陌生,所以我陷入了这个基本的东西)?也许将树状图和 SSD 与集群数量进行对比会很有趣...... 只看树状图的顶部。关键是,你想看看是否有一个明确的阈值。如果树状图在顶部没有大台阶,则意义不大。 SSD 无法捕捉到这一点,因为它测试一个特定的水平切割,而不是是否有充分的理由选择这个切割。【参考方案2】:

这是一个非常晚的答案,可能不再对提问者有用 - 但可能对其他人有用。查看包 NbClust。它包含 26 个索引,可为您提供建议的集群数量(您也可以选择集群类型)。您可以以这样一种方式运行它,即您可以获得所有索引的结果,然后您基本上可以使用大多数索引推荐的集群数量。是的,我认为基本统计数据是描述集群的最佳方式。

【讨论】:

【参考方案3】:

您也可以尝试 R-NN 曲线方法。 http://rguha.net/writing/pres/rnn.pdf

【讨论】:

感谢您的建议和链接!你在 R 中做过吗? 在进行分割时,我正在处理 48 个点的时间序列,因此 R-NN 曲线方法不适合我的需要,因为降低维度会消除我试图强调的差异......但是我可能仍然可以帮助你。我必须在某个地方拥有比我发布的简单文档更详细的文档(包括一些脚本)。我一找到就回来。【参考方案4】:

K 表示聚类对数据规模高度敏感,例如对于一个人的年龄和薪水,如果未标准化,K 均值将考虑薪水更重要的聚类变量,而不是年龄,这是您不想要的。因此,在应用聚类算法之前,最好将数据规模标准化,使它们处于同一水平,然后应用 CA。

【讨论】:

以上是关于层次聚类:确定最佳聚类数并统计描述聚类的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit 选择层次凝聚聚类中的聚类数

R语言确定聚类的最佳簇数:3种聚类优化方法

R中的聚类分析:确定最佳聚类数

聚类-层次聚类(谱系聚类)算法

matlab 聚类分析kmeans和cluster的区别

检索 R 中的最佳聚类数