如何确定R语言中kamila聚类的最优簇数?
Kamila聚类最优簇数判定逻辑及可视化方法
一、最优簇数(k=5)的判定逻辑
你代码里用的calcNumClust = "ps"是**预测强度(Prediction Strength)**方法,这是kamila包用来选择最优簇数的核心逻辑,具体步骤是这样的:
- 核心思路:通过评估聚类结果的稳定性来选k——如果一个聚类结果稳定,那么把数据拆分后,训练集的聚类模型能很好地给测试集样本分配簇,且同一簇的测试样本内部一致性高。
- 具体执行步骤(对应你代码里的参数):
- 重复
numPredStrCvRun=10次,每次把数据集拆分成训练集和测试集; - 在训练集上用kamila聚成指定的k个簇;
- 基于连续变量的标准化距离、分类变量的匹配度,把测试集样本分配到训练集的簇中;
- 对每个簇,计算预测强度:测试集中被分到该簇的样本里,两两之间都被判定为同一簇的比例;
- 取所有簇中最小的预测强度,作为当前k对应的整体预测强度(因为要保证所有簇都有足够的稳定性);
- 重复
- 最优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
相关产品推荐
相关产品推荐

