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

R语言是否有计算散度矩阵的函数?聚类特征选择需求求助

R实现类内/类间散度矩阵计算(对应Fukunaga聚类特征选择准则)

针对你需要的《Introduction to Statistical Pattern Recognition 2nd Ed》第10章10.2节的散度矩阵与J值计算,R里没有现成的ScatterMatrices()函数,但可以自己实现核心逻辑,以下是完整代码:

自定义散度矩阵计算函数

这个函数会计算类内散度矩阵(Sw)、类间散度矩阵(Sb),以及常用的J值(类间散度迹与类内散度迹的比值,可根据书中公式调整):

scatter_matrices <- function(data, labels) {
  # 参数说明:
  # data: 数据矩阵,每行代表一个样本,每列代表一个特征
  # labels: 每个样本对应的聚类/类别标签向量
  
  # 计算总体均值
  mean_total <- colMeans(data)
  # 获取所有唯一类别
  classes <- unique(labels)
  
  # 初始化散度矩阵
  Sw <- matrix(0, ncol(data), ncol(data))
  Sb <- matrix(0, ncol(data), ncol(data))
  
  for (cls in classes) {
    # 提取当前类别的样本
    cls_samples <- data[labels == cls, ]
    n_cls <- nrow(cls_samples)
    # 计算当前类别的均值
    mean_cls <- colMeans(cls_samples)
    
    # 更新类内散度矩阵(累加每个类别的加权协方差)
    Sw <- Sw + (n_cls - 1) * cov(cls_samples)
    # 更新类间散度矩阵(累加类均值与总体均值差的外积)
    mean_diff <- mean_cls - mean_total
    Sb <- Sb + n_cls * outer(mean_diff, mean_diff)
  }
  
  # 计算J值(这里用迹之比,可根据书中10.2节公式替换为行列式等)
  J_value <- sum(diag(Sb)) / sum(diag(Sw))
  
  # 返回结果
  list(
    within_scatter = Sw,
    between_scatter = Sb,
    J_value = J_value
  )
}

使用示例

用模拟数据测试函数效果:

set.seed(123)
# 生成两类模拟数据
data <- rbind(
  matrix(rnorm(50*2, mean = 0), ncol=2),  # 类别1
  matrix(rnorm(50*2, mean = 3), ncol=2)   # 类别2
)
labels <- rep(c(1, 2), each = 50)

# 计算散度矩阵与J值
result <- scatter_matrices(data, labels)

# 查看结果
print("类内散度矩阵:")
print(result$within_scatter)
print("类间散度矩阵:")
print(result$between_scatter)
print("J值:")
print(result$J_value)

调整说明

如果书中10.2节的J准则是其他形式(比如行列式比值det(Sb)/det(Sw)),只需修改J_value的计算行即可:

# 替换为行列式比值的J值
J_value <- det(Sb) / det(Sw)

内容的提问来源于stack exchange,提问作者刘安琪

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:25:24