我有以下数据集:
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
我们再次更新距离矩阵
因此我应该进行以下合并
但是这里有R
情节产生的悖论。那么,你如何证明这一点呢?
答案 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"))
请注意method
对hclust
来电method = single
的更改。默认method
为method = complete
。 complete
链接方法不基于最短距离将节点连接到节点,但是最长集群间距离。从奇妙的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
,然后您将其转换为矩阵,然后在调用{{{}}时调用dist
1}}。
我们可以按如下方式检查距离对象:
plot
在将此对象传递给> dt
A B C
B 2.236068
C 2.236068 1.414214
D 3.000000 2.828427 1.414214
函数之前,无需再次调用dist
。