问题 分层聚类:确定最佳聚类数并统计描述聚类


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

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

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

我为一个对象子集生成了一个脚本来进行第一次测试运行。它看起来像这样(脚本中的步骤解释,下面的来源)。

    #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)

来源


12832
2017-11-06 10:51


起源

你可能想看一下带有R的数字生态学,Borcard,Gillet和Legendre,它们对聚类分析有一个很好的章节: springer.com/statistics/life+sciences,+medicine+%26+health/book/... - Drew Steen
我刚刚在我们的图书馆里找到了这本书的副本,并会看一下。感谢您的建议!...我必须承认,我发现很多关于如何执行群集分析的手册很奇怪,而且很少有关于如何实际处理结果的手册:/ - Joschi
在我看来,这是因为有更多人知道如何执行CA而不是了解结果!如果您喜欢这本书,您可能还想查看勒让德和勒让德数字生态学,这不是特定于R的,但是非常通用且具有权威性。 - Drew Steen
@Drew Steen再次感谢您对文献的建议。我刚收到这本书,它附带了许多有趣的方法来深化聚类分析并绘制异化。当我得到它时,我会试着发布一个解决方案。 - Joschi
我已在其他地方回答了问题,其中涉及上述第1部分: stackoverflow.com/a/15376462/1036500 - Ben


答案:


链接指示的肘部标准适用于 K均值。群集均值显然与k均值相关,并且不适合于链接聚类(特别是不适用于单链接,参见单链接效应)。

但是提到你的问题标题 层次聚类你的代码也是如此?

请注意,肘部标准不会选择最佳簇数。它选择最佳数量 k均值集群。如果使用其他群集方法,则可能需要不同数量的群集。

没有客观上最好的聚类。因此,也没有客观上最好的簇数。 k-means有一个经验法则,它选择群集数量和最小化目标函数之间的(可能是最好的)权衡(因为增加了群集的数量) 总是 可以改善目标功能);但这主要是为了反击 赤字 k-means。这绝不是客观的。

聚类分析本身不是一项客观任务。聚类在数学上可能是好的,但是没用。聚类可能在数学上得分更差,但它可能会为您提供 深入了解您的数据 无法用数学方法测量。


6
2017-11-06 20:54



谢谢您的回答。我认为它突出了聚类分析中的一些重要观点。我完全同意你的意见,没有客观上最好的聚类这样的东西。聚类方法在很大程度上是主观的,事实上我并没有寻找一种客观的方法来解释聚类方法的结果。我正在/正在寻找一种强大的方法来确定R中层次聚类中代表最佳数据结构的最佳簇数。我认为这在聚类分析中是一个棘手的问题,因为正如你所提到的,总有一堆... - Joschi
......可能的解决方案。因此,除了经验解释之外,一些统计指标可用于基于聚类内部的同质性和它们之间的异质性来确定大量聚类。基于SSD的弯头标准不一定与k均值算法相关联。 Ward-Clustering也基于最小化集群内的SSD(不同之处在于此任务以分层方式执行)。因此,SSD中的肘部可以指示大量的同质群集,其中SSD在群集内部仍然较低而在它们之间较高。 - Joschi
对于分层聚类,常见的方法是查看树形图。只修复目标簇数并不能让您选择不同深度的切割。视觉检查在这里有很多帮助。 - Anony-Mousse
如果我理解它正确而不是查看树形图并且根据簇的数量绘制SSD是完全相同的不是吗?锁定在我的dendogramm的问题是,我有这么多的物体,我的树状图太长,看不到任何东西。也许你有一个建议如何以更高的分辨率绘制它(我对R很新,所以我陷入了这个基本的东西)?也许有趣的是将树形图和固态硬盘与群集的数量进行对比...... - Joschi
只看树状图的顶部。关键是,你想看看是否有一个明确的门槛。如果树形图在顶部没有大的步骤,那么它并不重要。 SSD无法捕获这个,因为它测试 一 特别是水平切割,而不是是否有充分的理由选择这种切割。 - Anony-Mousse


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


3
2017-12-24 02:37





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


1
2018-04-11 21:57



感谢您的建议和链接!你有没有在R做过这个? - Joschi
在处理分割时,我正在处理48点的时间序列,因此R-NN曲线方法不符合我的需要因为降低维度消除了我试图突出的差异......但我可能仍然可以帮助你。我必须在某个地方拥有比我发布的简单文档更详细(包括一些脚本)的文档。我一找到它就会回来。 - Michele