【问题标题】:How to draw hierarchical clustering?如何绘制层次聚类?
【发布时间】:2017-05-01 06:20:27
【问题描述】:

我有以下数据集:

data<-data.frame(X=c(1,2,3,4),Y=c(1,3,2,1))
for(i in 1:nrow(data)){ data[i,i]<-NA}
colnames(data) <- c("A","B","C","D")
rownames(data) <- c("A","B","C","D")
plot(hclust(dist(data)))

然后结果是下图:

但是,我想知道这个图是如何绘制的。在这里,我试图一步一步地获得树状图。我们知道一开始的距离矩阵如下:

每次我们找到距离最小的两个点,然后将它们合并为一个聚类

所以,第一次合并是B,和C。然后我们更新距离矩阵

我们再次找到距离最小的 2 个点,即 D,集群为 B,C

我们再次更新距离矩阵

因此我应该有以下合并

  1. B 和 C
  2. B、C 和 D
  3. B、C、D 和 A

但这里与R 情节产生的矛盾。那么,你如何证明它的合理性呢?

【问题讨论】:

    标签: r


    【解决方案1】:

    更新的响应 - 使用 single 链接而不是默认的 complete 链接。

    我会尽我所能解释我如何看待这个工作。我相信这与hclust. 中使用的method 参数一样简单hclust 的默认方法不遵循您制定的算法,但我们可以调整method 使其如此。

    但首先,我在您尝试制作的情节上遇到了错误:

    > data<-data.frame(X=c(1,2,3,4),Y=c(1,3,2,1))
    > for(i in 1:nrow(data)){ data[i,i]<-NA}
    > colnames(data) <- c("A","B","C","D")
    > rownames(data) <- c("A","B","C","D")
    > plot(hclust(dist(data)))
    Error in hclust(dist(data)) : 
      NA/NaN/Inf in foreign function call (arg 11)
    

    您对for(i in 1:nrow(data)){ data[i,i]&lt;-NA} 行的意图是什么?在该行之后,您的 data 对象如下所示:

       X  Y V3 V4
    1 NA  1 NA NA
    2  2 NA NA NA
    3  3  2 NA NA
    4  4  1 NA NA
    

    但是,如果我们可以从以下代码开始,我们可以生成所需的树,如下所示:

    dt<-data.frame(X = c(1, 2, 3, 4), Y = c(1, 3, 2, 1))
    rownames(dt) <- c("A", "B", "C", "D")
    dt<-dist(dt)
    plot(hclust(dt, method = "single"))
    

    注意hclust 调用method = singlemethod 的变化。默认methodmethod = completecomplete 链接方法根据最短距离而是最长簇间距离将簇加入节点。从奇妙的Introduction to Statistical Learning with Applications in R 中提取一些材料,其中描述了可用的各种链接方法:

    本文由 James、Witten、Hastie 和 Tibshirani 撰写,可通过上面的链接免费下载。关于层次聚类的部分从第 390 页开始。如果这有助于理清问题,请告诉我。

    原始回复

    我认为您以错误的方式调用了dist 函数,并且可能调用了太多次。试试这个:

    dt<-data.frame(X=c(1,2,3,4),Y=c(1,3,2,1))
    rownames(dt) <- c("A","B","C","D")
    dt<-dist(dt)
    plot(hclust((dt)))
    

    实际上,您在一个已经是 dist 类的对象上调用 dist,然后您将其转换为一个矩阵,然后在您对 plot 的调用中再次调用 dist

    我们可以只检查距离对象如下:

    > dt
             A        B        C
    B 2.236068                  
    C 2.236068 1.414214         
    D 3.000000 2.828427 1.414214
    

    在将此对象传递给hclust 函数之前,无需再次对该对象调用dist

    【讨论】:

    • @Salman,感谢您对您的问题提供更多说明。我更新了我的回复,在hclust 函数中包含了对链接类型的解释,该函数可以使用method 参数指定。除了默认的method 之外,使用不同的method 可能会产生您期望的结果。
    • 感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 2012-08-08
    • 2018-10-04
    • 2014-06-28
    • 2013-05-08
    • 2016-08-07
    • 2015-08-12
    • 2015-12-14
    • 2020-06-10
    相关资源
    最近更新 更多