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

关于R语言中K-Modes聚类稳定性及分类数据聚类的技术问询

K-Modes聚类稳定性:问题、评估与优化方案

嘿,关于K-Modes聚类的稳定性问题,我刚好有不少实用的经验可以分享给你~毕竟分类数据的聚类本身就容易受初始值影响,K-Modes也逃不开这个坑,下面咱一步步拆解:

为什么K-Modes会有稳定性问题?

和K-Means类似,K-Modes的初始簇中心是随机选取的,不同的初始值可能导致最终的聚类结果差异很大——尤其是当你的数据里类别分布比较均匀、没有明显“簇结构”的时候,这种随机性带来的波动会更明显。你代码里虽然固定了set.seed(100000),但这只能保证同一次运行的可重复性,没法解决不同初始条件下结果不一致的问题。

怎么评估K-Modes聚类的稳定性?

1. 重复聚类+一致性指标

多次运行K-Modes(用不同的随机种子),然后用调整兰德指数(ARI)或者Jaccard系数来衡量不同结果之间的相似性。ARI的取值范围是[-1,1],越接近1说明聚类结果越稳定。

示例代码:

library(klaR)
library(aricode)

# 设定重复次数
n_repeats <- 10
# 存储每次的簇分配
cluster_assignments <- list()

# 多次运行K-Modes
for (i in 1:n_repeats) {
  set.seed(i * 1000) # 使用不同随机种子
  cluster_res <- kmodes(data_cluster, 5, iter.max = 100, weighted = FALSE)
  cluster_assignments[[i]] <- cluster_res$cluster
}

# 计算所有结果对的ARI均值
ari_matrix <- matrix(NA, nrow = n_repeats, ncol = n_repeats)
for (i in 1:n_repeats) {
  for (j in 1:n_repeats) {
    ari_matrix[i,j] <- ARI(cluster_assignments[[i]], cluster_assignments[[j]])
  }
}

# 输出平均ARI值
mean(ari_matrix[upper.tri(ari_matrix)])

2. Bootstrap抽样验证

对原始数据进行多次有放回抽样,每次抽样后做K-Modes聚类,然后看同一个原始样本被分到同一簇的频率——频率越高,说明该样本的簇分配越稳定。

示例代码:

library(klaR)

n_bootstrap <- 10
n_samples <- nrow(data_cluster)
# 存储每个样本的簇分配频率(假设k=5)
cluster_freq <- matrix(0, nrow = n_samples, ncol = 5) 

for (b in 1:n_bootstrap) {
  # 有放回抽样
  boot_sample <- sample(1:n_samples, n_samples, replace = TRUE)
  boot_data <- data_cluster[boot_sample, ]
  # 执行聚类
  set.seed(b * 500)
  cluster_res <- kmodes(boot_data, 5, iter.max = 100, weighted = FALSE)
  # 映射回原始样本,更新频率
  for (i in 1:n_samples) {
    pos <- which(boot_sample == i)
    if (length(pos) > 0) {
      cluster_freq[i, cluster_res$cluster[pos[1]]] <- cluster_freq[i, cluster_res$cluster[pos[1]]] + 1
    }
  }
}

# 计算每个样本的最大簇分配频率(越接近1越稳定)
max_freq <- apply(cluster_freq, 1, max) / n_bootstrap
summary(max_freq)

怎么提升K-Modes聚类的稳定性?

  • 多次运行取最优结果:不用只固定一个种子,多跑几次,选withindiff最小的那个聚类结果——这个值越小,说明簇内的异质性越低,结果越可靠。
  • 开启加权模式:你代码里weighted=FALSE,可以改成weighted=TRUE,这样K-Modes会给出现频率更高的样本更高的权重,聚类结果会更偏向数据的主流分布,稳定性更强。
  • 自定义初始簇中心:不要用随机初始值,比如手动选择数据中频率最高的几个类别组合作为初始中心,示例代码:
    # 手动生成初始中心:取每个变量的最频繁类别
    init_centers <- apply(data_cluster, 2, function(x) names(which.max(table(x))))
    # 执行聚类(如果k>1,可以生成多个不同的初始中心组合)
    cluster_res <- kmodes(data_cluster, 5, iter.max = 100, weighted = TRUE, init = init_centers)
    
  • 先做数据预处理:如果数据里有很多低频率的类别,可以先合并一些相似类别,减少数据噪声,也能提升聚类的稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:14:39