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

如何用fviz_nbclust可视化diana聚类的最优簇数

解决fviz_nbclust与NbClust输出、diana聚类结果的配合问题

我来帮你一步步拆解并解决这个问题,你遇到的核心是fviz_nbclust对不同输入的适配逻辑,以及如何把diana的分裂式层次聚类整合到簇数评估的可视化流程中。


一、基于NbClust输出生成可视化图

你已经通过NbClust结合diana的距离矩阵算出了最优簇数,但直接传入fviz_nbclust没出图,是因为fviz_nbclust对NbClust对象的处理需要先提取内部的指标数据。你可以这样操作:

  1. 先从NbClust结果中提取簇数与对应轮廓系数的数据集:
# 提取簇数范围(对应你设置的min.nc=2到max.nc=50)和对应的轮廓系数值
nbclust_stats <- data.frame(
  Number_clusters = 2:50,
  Value_Index = mydata.nc$All.index[, "silhouette"]
)
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:37:47