在R中使用cutree函数后,如何获取新的hclust对象?
如何从cutree结果生成新的hclust对象?
你已经知道cutree会输出每个样本的聚类标签向量,但如果需要获取切割后的聚合树结构(新的hclust对象),可以通过以下两种方式实现:
方式1:获取单个聚类的子树hclust对象
利用dendextend包的cut()函数切割 dendrogram 对象,提取每个聚类对应的子树,再转换为hclust格式:
library(gplots) library(dendextend) # 你的原始代码 data <- iris[,1:4] distance <- dist(data, method = "euclidean", diag = FALSE, upper = FALSE) hc <- hclust(distance, method = 'ward.D') dnd <- as.dendrogram(hc) plot(dnd) abline(h=hc$height[140],col="red") # 按指定高度切割树 cut_result <- cut(dnd, h = hc$height[140]) # 提取每个聚类对应的子树(dendrogram格式) sub_dend_list <- cut_result$lower # 将任意子树转换为hclust对象并可视化 sub_hc <- as.hclust(sub_dend_list[[1]]) plot(sub_hc, main = "第一个聚类的子树")
方式2:生成简化的整体hclust对象(聚类作为叶节点)
如果需要得到一个简化的层次聚类树,把每个切割后的聚类当作一个叶节点,保留上层聚合关系,可以通过计算聚类中心后重新聚类实现:
# 获取cutree的聚类标签 cluster_labels <- cutree(hc, h = hc$height[140]) # 计算每个聚类的特征均值(作为聚类中心) cluster_centers <- aggregate(data, by = list(cluster = cluster_labels), FUN = mean) # 计算聚类中心之间的距离 center_dist <- dist(cluster_centers[, -1], method = "euclidean") # 对聚类中心执行层次聚类,得到简化的hclust对象 simplified_hc <- hclust(center_dist, method = "ward.D") # 可视化简化后的树 plot(simplified_hc, main = "切割后的简化层次聚类树", labels = paste("Cluster", cluster_centers$cluster))
说明
cut()函数针对dendrogram对象操作,能精准提取切割点以下的子树结构- 简化树的构建需要基于聚类中心重新计算,因为原hclust的合并记录是针对原始样本的,无法直接生成以聚类为节点的上层结构
内容的提问来源于stack exchange,提问作者Jiadong Fang
相关产品推荐
相关产品推荐

