如何用fviz_nbclust可视化diana聚类的最优簇数
解决fviz_nbclust与NbClust输出、diana聚类结果的配合问题
我来帮你一步步拆解并解决这个问题,你遇到的核心是fviz_nbclust对不同输入的适配逻辑,以及如何把diana的分裂式层次聚类整合到簇数评估的可视化流程中。
一、基于NbClust输出生成可视化图
你已经通过NbClust结合diana的距离矩阵算出了最优簇数,但直接传入fviz_nbclust没出图,是因为fviz_nbclust对NbClust对象的处理需要先提取内部的指标数据。你可以这样操作:
- 先从
NbClust结果中提取簇数与对应轮廓系数的数据集:
# 提取簇数范围(对应你设置的min.nc=2到max.nc=50)和对应的轮廓系数值 nbclust_stats <- data.frame( Number_clusters = 2:50, Value_Index = mydata.nc$All.index[, "silhouette"] )
- 用
fviz_nbclust直接可视化这个数据集:
p_sil <- fviz_nbclust(nbclust_stats, x = "Number_clusters", y = "Value_Index", method = "silhouette", linecolor = "coral", title = "Silhouette Method for Optimal Clusters (Diana)") print(p_sil)
这样就能生成轮廓系数随簇数变化的折线图,直观验证最优簇数为2的结论。
二、直接将diana整合到fviz_nbclust的簇数评估流程
你尝试替换hcut为diana时报错,是因为hcut默认依赖hclust做层次聚类,而diana是分裂式聚类方法,需要自定义一个适配fviz_nbclust要求的函数。
步骤1:自定义适配diana的聚类函数
fviz_nbclust的FUN参数需要一个能接收k(簇数)参数、并返回带cluster属性的聚类结果的函数。我们可以写一个包装函数:
# 自定义适配fviz_nbclust的diana聚类函数 diana_for_fviz <- function(data, k, ...) { # 如果已经有预先计算好的距离矩阵(比如mydatad.diana$diss),可以跳过这步直接传入 diss_mat <- dist(data, ...) # 运行diana聚类 diana_res <- diana(diss_mat, ...) # 提取指定k的簇分配结果 cluster_assign <- cutree(diana_res, k = k) # 包装成fviz_nbclust能识别的结构(模拟hclust对象的cluster属性) structure(list(cluster = cluster_assign), class = "hclust") }
步骤2:用fviz_nbclust调用自定义函数
现在你可以直接用这个函数评估不同簇数的指标(比如轮廓系数、组内平方和):
# 用轮廓系数方法评估diana聚类的最优簇数 p_sil_diana <- fviz_nbclust(mydatad, FUN = diana_for_fviz, method = "silhouette", k.max = 10, metric = "euclidean") print(p_sil_diana) # 用组内平方和(wss)方法评估 p_wss_diana <- fviz_nbclust(mydatad, FUN = diana_for_fviz, method = "wss", k.max = 10, metric = "euclidean") print(p_wss_diana)
如果你已经有预先计算好的diana距离矩阵(mydatad.diana$diss),可以修改函数直接复用这个矩阵,避免重复计算:
# 针对已有的diana距离矩阵的自定义函数 diana_from_diss <- function(diss_mat, k) { diana_res <- diana(diss_mat) cluster_assign <- cutree(diana_res, k = k) structure(list(cluster = cluster_assign), class = "hclust") } # 调用时传入距离矩阵 p_sil_precomputed <- fviz_nbclust(mydatad.diana$diss, FUN = diana_from_diss, method = "silhouette", k.max = 10) print(p_sil_precomputed)
三、关于hcut默认选项的补充说明
hcut是factoextra包中的封装函数,默认参数为:
method = "complete"(对应hclust的聚类方法)hclust_func = hclust(默认使用凝聚式层次聚类的hclust)
所以它无法直接兼容diana,必须通过自定义FUN函数的方式来适配分裂式聚类逻辑。
四、最优簇数确定后的聚类可视化
当你确认最优簇数为2后,还可以用fviz_dend可视化diana的聚类树并标记簇:
fviz_dend(mydatad.diana, k = 2, rect = TRUE, rect_fill = TRUE, rect_border = "steelblue", labels = FALSE, main = "Diana Clustering Dendrogram (k=2)")
内容的提问来源于stack exchange,提问作者Maria Eugenia D'Amato
相关产品推荐
相关产品推荐

