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

请求提供基于R语言klaR包的K-Modes聚类SW/SB比值验证实操示例

K-Modes聚类的SW/SB比值验证实操示例

目前针对K-Modes的内部聚类验证方法较为有限,有研究采用SW/SB比值作为验证指标(SW为组内总异质性,SB为组间总异质性),比值越小说明聚类效果越优。以下是基于R语言klaR包的实操示例:

1. 加载包并构建玩具数据集

library(klaR)

# 构建玩具数据集:5个分类变量,每个变量取值1-3各重复40次,共120条样本
x1 = rep(1:3, times = 40)
x2 = rep(1:3, times = 40)
x3 = rep(1:3, times = 40)
x4 = rep(1:3, times = 40)
x5 = rep(1:3, times = 40)
dat <- data.frame(x1, x2, x3, x4, x5)

2. 运行K-Modes聚类

# 设定聚类数为3,运行K-Modes
km <- kmodes(dat, 3)

3. 实现SW/SB比值计算

核心逻辑

  • SW(组内总异质性):所有样本到所属聚类模态的汉明距离之和
  • SB(组间总异质性):各聚类模态到全局模态的汉明距离,乘以对应聚类的样本量后求和
  • 最终计算SW/SB比值

代码实现

# 定义汉明距离计算函数:两个样本向量的不同变量个数
hamming_dist <- function(a, b) {
  sum(a != b)
}

# 计算全局模态:每个变量的众数
global_mode <- sapply(dat, function(col) {
  names(sort(table(col), decreasing = TRUE))[1]
})
# 转换为与聚类模态一致的格式(数据框)
global_mode <- as.data.frame(t(global_mode))

# 计算SW:组内总距离
SW <- 0
for (cluster in unique(km$cluster)) {
  # 提取当前聚类的样本和模态
  cluster_samples <- dat[km$cluster == cluster, ]
  cluster_mode <- km$modes[cluster, ]
  
  # 累加当前聚类内所有样本到模态的距离
  cluster_dist <- apply(cluster_samples, 1, function(row) {
    hamming_dist(row, cluster_mode)
  })
  SW <- SW + sum(cluster_dist)
}

# 计算SB:组间总距离
SB <- 0
for (cluster in unique(km$cluster)) {
  cluster_size <- sum(km$cluster == cluster)
  cluster_mode <- km$modes[cluster, ]
  
  # 计算当前模态到全局模态的距离
  mode_dist <- hamming_dist(cluster_mode, global_mode)
  SB <- SB + cluster_size * mode_dist
}

# 计算SW/SB比值
sw_sb_ratio <- SW / SB
cat("SW/SB比值:", sw_sb_ratio, "\n")

结果说明

运行上述代码后得到的SW/SB比值越小,代表聚类的组内紧凑性越好、组间区分度越高,聚类效果越理想。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:28:39