基于TramineR的Ward层次聚类最优聚类数确定方法咨询
Ward层次聚类最优聚类数判定方法
以下方法均适配你当前的序列距离+Ward层次聚类的场景,可按需选择:
1. 肘法
原理:Ward法的聚类合并高度直接对应组内离均差平方和的增量,随着聚类数减少、簇不断合并,组内平方和会逐步上升,上升速率突然变缓的拐点对应的就是最优聚类数。
你可以直接用聚类结果的height属性快速绘制肘图:
# 简化版肘图,无需额外计算指标 # 反转合并高度对应k从大到小的变化 plot(rev(clusterward$height), type = "b", pch = 16, xlab = "聚类数k", ylab = "合并高度", xaxt = "n") axis(1, at = 1:length(clusterward$height), labels = rev(2:(length(clusterward$height)+1)))
找到折线的拐点对应的k值即可。
2. 轮廓系数法
原理:轮廓系数衡量每个样本和自身所在簇的相似度、与其他簇的相似度差值,取值范围为[-1,1],整体平均轮廓系数越高说明聚类区分度越好,取平均系数最高的k为最优值。
使用前如果未安装cluster包,先运行install.packages("cluster"):
library(cluster) # 自定义测试的聚类数范围,可根据数据量调整 k_range <- 2:15 sil_scores <- sapply(k_range, function(k){ cl <- cutree(clusterward, k = k) mean(silhouette(cl, df_new.seq.om)[, "sil_width"]) }) # 绘制系数变化曲线 plot(k_range, sil_scores, type = "b", pch = 16, xlab = "聚类数k", ylab = "平均轮廓系数", main = "轮廓系数选最优k") # 直接提取最优k值 best_k <- k_range[which.max(sil_scores)]
3. 聚类树直观判定
你已经生成的层次聚类树也可以直接辅助判断:观察不同层级合并的高度差,合并高度跳变最大的位置切分,对应的就是最优聚类数。也可以用factoextra包可视化切分效果验证合理性:
# 未安装先运行install.packages("factoextra") library(factoextra) fviz_dend(clusterward, k = best_k, # 替换为前面得到的最优k值 cex = 0.6, palette = "jco", rect = TRUE, rect_border = "jco", rect_fill = TRUE)
补充业务适配建议
如果是业务场景使用,除了上述统计指标,还需要结合聚类结果的业务可解释性调整k值,比如确认不同簇的特征是否有明确的业务区分度,避免出现无实际意义的过小簇。
内容的提问来源于stack exchange,提问作者Rstudent
相关产品推荐
相关产品推荐

