如何绘制层次聚类?

时间:2017-04-28 14:31:59

标签: r

我有以下数据集:

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

然后结果如下图所示:

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

我们再次更新距离矩阵

enter image description here

因此我应该进行以下合并

  1. B,C
  2. B,C和D
  3. B,C,D和A
  4. 但是这里有R情节产生的悖论。那么,你如何证明这一点呢?

1 个答案:

答案 0 :(得分:9)

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

我会尽力解释我是如何看待这种情况的。我相信这就像method中使用的hclust.参数一样简单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]<-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"))

enter image description here

请注意methodhclust来电method = single的更改。默认methodmethod = completecomplete链接方法基于最短距离将节点连接到节点,但是最长集群间距离。从奇妙的Introduction to Statistical Learning with Applications in R中提取一些材料,描述了各种可用的连接方法:

enter image description here

本文由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)))

enter image description here

实际上,您在一个已经是dist类的对象上调用了dist,然后您将其转换为矩阵,然后在调用{{{}}时调用dist 1}}。

我们可以按如下方式检查距离对象:

plot

在将此对象传递给> dt A B C B 2.236068 C 2.236068 1.414214 D 3.000000 2.828427 1.414214 函数之前,无需再次调用dist