如何检验k-means聚类结果的统计有效性与簇的显著性?
k-means聚类簇统计显著性验证方法
你可以通过以下几种方法交叉验证得到的2个鸢尾花聚类簇的统计显著性:
差距统计量(Gap Statistic)验证
你现有代码中已经调用了clusGap函数计算Gap统计量,该指标本身就是用于判断聚类结构显著性的核心指标:
Gap统计量通过对比真实数据的聚类内平方和,与随机生成的无结构参考数据集的聚类内平方和的差异,判断聚类是否存在真实结构。
如果你的输出结果满足 Gap(K=2) - se(K=2) > Gap(K=1),即可证明2簇结构显著优于无聚类的单簇情况,聚类结构具备统计显著性。
置换检验
这是验证聚类显著性最通用的方法,核心逻辑是通过随机打乱特征值生成无聚类结构的空数据集,对比真实聚类的组内平方和(WSS)与空数据集的WSS分布,计算P值:
# 真实数据的k-means结果 real_km <- scale(iris[1:4]) %>% kmeans(nstart = 25, centers = 2) real_wss <- sum(real_km$withinss) # 置换检验,重复1000次 set.seed(123) perm_wss <- replicate(1000, { # 随机打乱每一列特征 perm_data <- apply(scale(iris[1:4]), 2, sample) perm_km <- kmeans(perm_data, nstart = 25, centers = 2) sum(perm_km$withinss) }) # 计算p值:随机数据集WSS小于真实WSS的比例 p_value <- mean(perm_wss < real_wss) # 通常p < 0.05即可认为聚类具备统计显著性 print(p_value)
轮廓系数显著性验证
轮廓系数衡量了样本与所属簇的相似度,以及与其他簇的差异度,取值范围为-1~1,数值越高聚类质量越好。你可以对比真实数据的平均轮廓系数与随机置换数据的轮廓系数分布,判断显著性:
library(cluster) # 真实数据的平均轮廓系数 real_sil <- silhouette(real_km$cluster, dist(scale(iris[1:4]))) %>% mean() # 置换检验计算轮廓系数的p值 perm_sil <- replicate(1000, { perm_data <- apply(scale(iris[1:4]), 2, sample) perm_km <- kmeans(perm_data, nstart = 25, centers = 2) silhouette(perm_km$cluster, dist(perm_data)) %>% mean() }) p_value_sil <- mean(perm_sil > real_sil) print(p_value_sil)
特征组间差异检验
聚类有效的核心前提是簇间特征差异显著大于簇内差异,你可以对4个花部特征分别做Wilcoxon秩和检验,判断两个簇之间的特征差异是否具备统计显著性:
scaled_iris <- scale(iris[1:4]) %>% as.data.frame() %>% mutate(cluster = real_km$cluster) # 对每个特征做两组秩和检验 lapply(names(scaled_iris)[1:4], function(col) { wilcox.test(scaled_iris[scaled_iris$cluster==1, col], scaled_iris[scaled_iris$cluster==2, col]) })
如果大部分特征的检验P值均小于0.05,即可进一步支撑聚类的有效性。
内容的提问来源于stack exchange,提问作者Ginko-Mitten
相关产品推荐
相关产品推荐

