You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R绘制凝聚层次聚类(AHC)完全连接法树状图的高度差异问题

问题:手动完全连接聚类与R语言hclust结果不一致的原因分析

背景与问题描述

我通过完全连接法(complete linkage)计算出的聚类成对距离为{0.5,1.12,1.5,3.61},对应的距离矩阵如下:

Matrix
x1,x2,x3,x4,x5
0,0.5,2.24,3.35,3
0.5,0,2.5,3.61,3.04
2.24,2.5,0,1.12,1.41
3.35,3.61,1.12,0,1.5
3,3.04,1.41,1.5,0

但用R语言的cluster包实现完全连接聚类时,代码如下:

library(cluster)
dt<-read.csv("cluster.csv")
df<-scale(dt[-1])
dc<-dist(df,method = "euclidean")
hc1 <- hclust(dc, method = "complete" )
plot(hc1, labels = c("x1", "x2","x3","x4","x5"), hang = 0.1, main = "Cluster dendrogram", sub = NULL, xlab = NULL, ylab = "Height")
abline(h = hc1$height, lty = 2, col = "lightgrey")
str(hc1)

运行后str(hc1)输出的高度值为0.444、1.516、1.851、3.753,和手动计算的结果完全不一致,树状图也不同。想知道这种差异的原因是什么,是不是哪一步出错了?


核心原因分析

其实你和R代码的计算都没问题,差异的根源在于数据预处理步骤的不同:

  • 你手动计算时用的是原始数据的距离矩阵;
  • 但你的R代码里执行了df<-scale(dt[-1])——scale()函数默认会把数据的每一列标准化为均值0、标准差1的形式,这直接改变了样本间的欧氏距离,自然会导致后续聚类的合并高度和树状图完全不同。

举个简单的例子:如果原始数据中某列的数值范围是10-100,另一列是0-1,标准化后两列的权重会被拉平,样本间的距离计算逻辑就和原始数据完全不一样了。


验证与修正方法

要让R的结果和手动计算对齐,只需要去掉标准化步骤,直接用原始数据计算距离即可:

library(cluster)
dt<-read.csv("cluster.csv")
# 移除scale()步骤,直接使用原始特征列计算距离
dc<-dist(dt[-1], method = "euclidean")
hc1 <- hclust(dc, method = "complete")
plot(hc1, labels = c("x1", "x2","x3","x4","x5"), hang = 0.1, main = "Cluster dendrogram (原始数据)", sub = NULL, xlab = NULL, ylab = "Height")
abline(h = hc1$height, lty = 2, col = "lightgrey")
str(hc1)

执行这段代码后,hc1$height的结果会和你手动计算的{0.5,1.12,1.5,3.61}基本一致(可能存在微小的小数精度差异,比如R会保留更多小数位)。


总结

两种实现都没有错误,只是你在R代码中额外做了数据标准化,而手动计算用的是原始数据,这才导致了聚类结果的差异。如果你的分析场景需要标准化数据,那R的结果是合理的;如果要和手动计算对齐,就去掉scale()步骤即可。

内容的提问来源于stack exchange,提问作者User_4373

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:11:51