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

如何确定R语言中kamila聚类的最优簇数?

Kamila聚类最优簇数判定逻辑及可视化方法

一、最优簇数(k=5)的判定逻辑

你代码里用的calcNumClust = "ps"是**预测强度(Prediction Strength)**方法,这是kamila包用来选择最优簇数的核心逻辑,具体步骤是这样的:

  1. 核心思路:通过评估聚类结果的稳定性来选k——如果一个聚类结果稳定,那么把数据拆分后,训练集的聚类模型能很好地给测试集样本分配簇,且同一簇的测试样本内部一致性高。
  2. 具体执行步骤(对应你代码里的参数):
    • 重复numPredStrCvRun=10次,每次把数据集拆分成训练集和测试集;
    • 在训练集上用kamila聚成指定的k个簇;
    • 基于连续变量的标准化距离、分类变量的匹配度,把测试集样本分配到训练集的簇中;
    • 对每个簇,计算预测强度:测试集中被分到该簇的样本里,两两之间都被判定为同一簇的比例;
    • 取所有簇中最小的预测强度,作为当前k对应的整体预测强度(因为要保证所有簇都有足够的稳定性);
  3. 最优k的选择规则:
    程序会对比不同k值的预测强度,选择第一个满足预测强度超过predStrThresh=0.5阈值的最大k值,或者找到预测强度突变下降的“肘点”——当k增加到某个值后,预测强度突然跌破阈值,这个k之前的数值就是最优的。你的结果显示最优是5,说明k=5时,预测强度达标,且是符合条件的合适簇数。

你可以通过kamRes$predStrength查看k=5对应的具体预测强度数值,kamRes$optNumClust能直接返回最优簇数。

二、生成类似肘图的可视化图表

kamila包没有直接生成肘图的函数,但我们可以手动计算不同k值的预测强度,然后绘制折线图来模拟“肘图”效果,直观观察最优k的位置。

实现代码示例:

# 加载所需包
library(kamila)
library(ggplot2)

# 定义要测试的簇数范围(比如从2到8)
k_candidates <- 2:8
pred_strength_results <- numeric(length(k_candidates))

# 循环计算每个k对应的预测强度
for (idx in seq_along(k_candidates)) {
  current_k <- k_candidates[idx]
  # 运行kamila聚类,计算预测强度
  temp_res <- kamila(conVars, catVarsFac, numClust = current_k, 
                     numInit = 10, calcNumClust = "ps", 
                     numPredStrCvRun = 10, predStrThresh = 0.5)
  # 保存当前k的预测强度
  pred_strength_results[idx] <- temp_res$predStrength
}

# 构建绘图数据框
plot_data <- data.frame(
  Cluster_Count = k_candidates,
  Prediction_Strength = pred_strength_results
)

# 绘制预测强度折线图(类似肘图)
ggplot(plot_data, aes(x = Cluster_Count, y = Prediction_Strength)) +
  geom_line(color = "#2c3e50", size = 1.2) +
  geom_point(color = "#e74c3c", size = 3) +
  # 添加你设定的阈值线(0.5)
  geom_hline(yintercept = 0.5, linetype = "dashed", color = "#f39c12", size = 1) +
  labs(
    title = "Prediction Strength vs Number of Clusters",
    x = "Number of Clusters (k)",
    y = "Prediction Strength"
  ) +
  theme_minimal()

图表解读:

  • 橙色虚线是你设定的阈值0.5,当预测强度在这条线以上时,说明聚类稳定性达标;
  • 观察折线的变化:找到折线从稳定高位突然下降的“肘点”,或者第一个持续超过阈值的最大k值,就是你的最优簇数。比如你的结果里k=5应该是在阈值以上,且是符合条件的合适值。

内容的提问来源于stack exchange,提问作者Emrah BILGIC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:17:44