在R中能否预指定聚类结构后按标准聚类准则合并?
聚类合并与层次聚类构建的R实现方案
一、从k=9聚类结果合并至k=5的实现
1. 遵循Complete Linkage准则的合并
如果你的k=9聚类来自层次聚类(complete linkage方法),直接用cutree()即可完成合并——层次聚类的树状结构本身就是按complete linkage规则逐步生成的,cutree()只是从已有的树中切割到指定k值:
# 假设已通过complete linkage得到层次聚类结果hc hc <- hclust(dist(your_data), method = "complete") # 先得到k=9的聚类 clust_k9 <- cutree(hc, k = 9) # 直接切割到k=5,自动遵循complete linkage合并规则 clust_k5 <- cutree(hc, k = 5)
如果k=9结果来自k-means,需要先计算9个簇之间的complete linkage距离,再对簇做层次聚类后切割:
library(cluster) # 假设kmeans_k9是k-means得到的k=9结果,your_data为原始数据 # 计算簇间的complete linkage距离 cluster_dist <- dissimilarity(daisy(your_data, metric = "euclidean"), clustering = kmeans_k9$cluster, method = "complete") # 对9个簇构建层次聚类 hc_clusters <- hclust(cluster_dist, method = "complete") # 合并至k=5 clust_k5 <- cutree(hc_clusters, k = 5) # 将簇标签映射回原始样本 final_clust <- clust_k5[kmeans_k9$cluster]
2. 遵循k-means准则(最小化WSS)的合并
使用flexclust包的mergeClusters()函数可直接实现基于最小WSS增量的簇合并:
library(flexclust) # 将k-means的k=9结果转换为kcca对象 kcca_k9 <- as.kcca(kmeans_k9, your_data) # 合并至k=5,ward方法等价于最小化WSS增量 kcca_k5 <- mergeClusters(kcca_k9, k = 5, method = "ward") # 获取最终聚类标签 clust_k5 <- predict(kcca_k5)
另一种思路:以k=9的簇中心为初始值,重新运行k=5的k-means,也能保证合并后的WSS最优:
# 提取k=9的簇中心 centers_k9 <- kmeans_k9$centers # 随机选取5个中心作为初始值跑k=5的k-means kmeans_k5 <- kmeans(your_data, centers = centers_k9[sample(1:9, 5), ], nstart = 1)
二、构建不从单例聚类开始的层次凝聚结构
直接基于已有簇的距离矩阵构建层次聚类即可,无需从单个样本开始:
library(cluster) # 假设已有k=9的聚类结果clust_k9,your_data为原始数据 # 计算簇间距离矩阵(支持complete、average等多种方法) cluster_dist <- dissimilarity(daisy(your_data, metric = "euclidean"), clustering = clust_k9, method = "complete") # 基于簇间距离构建层次聚类树 hc_from_clusters <- hclust(cluster_dist, method = "complete") # 可视化簇层次结构 plot(hc_from_clusters, labels = paste("Cluster", 1:9))
该方法直接从k=9的簇出发生成层次结构,完全满足需求。
内容的提问来源于stack exchange,提问作者Vonvorv
相关产品推荐
相关产品推荐

