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

如何使用R语言sweep函数实现基于min和max的矩阵归一化

用R的sweep函数实现矩阵的Min-Max归一化

Min-Max归一化的公式是:yi = (xi - min(x)) / (max(x) - min(x)),我们可以通过两次调用sweep函数完成计算,具体实现如下:

按列归一化(最常用场景)

  1. 先计算矩阵每一列的最小值和最大值:
# 创建示例矩阵
set.seed(123)
mat <- matrix(rnorm(12, mean = 5, sd = 2), nrow = 4, ncol = 3)

# 计算列最小值和最大值
col_mins <- apply(mat, 2, min)
col_maxs <- apply(mat, 2, max)
  1. 第一次用sweep减去对应列的最小值:
mat_centered <- sweep(mat, MARGIN = 2, STATS = col_mins, FUN = "-")
  1. 计算列的极差(max - min),再用第二次sweep完成除法:
col_ranges <- col_maxs - col_mins
normalized_mat <- sweep(mat_centered, MARGIN = 2, STATS = col_ranges, FUN = "/")

也可以把两次sweep合并成一行代码:

normalized_mat <- sweep(sweep(mat, 2, col_mins, "-"), 2, col_ranges, "/")

按行归一化

如果需要按行进行归一化,只需调整apply和sweep的MARGIN参数为1(代表行):

# 计算行最小值和极差
row_mins <- apply(mat, 1, min)
row_ranges <- apply(mat, 1, max) - row_mins

# 执行归一化
normalized_mat_row <- sweep(sweep(mat, 1, row_mins, "-"), 1, row_ranges, "/")

处理特殊情况

如果某一列(或行)的所有值完全相同,极差会为0,直接除法会得到NaN。可以提前处理这种情况,比如将这类列的归一化结果设为0:

# 替换极差为0的值为1(避免除以0),再将对应列的结果设为0
col_ranges[col_ranges == 0] <- 1
normalized_mat <- sweep(mat_centered, 2, col_ranges, "/")
normalized_mat[, col_maxs == col_mins] <- 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:57:16