如何使用R语言sweep函数实现基于min和max的矩阵归一化
用R的sweep函数实现矩阵的Min-Max归一化
Min-Max归一化的公式是:yi = (xi - min(x)) / (max(x) - min(x)),我们可以通过两次调用sweep函数完成计算,具体实现如下:
按列归一化(最常用场景)
- 先计算矩阵每一列的最小值和最大值:
# 创建示例矩阵 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)
- 第一次用
sweep减去对应列的最小值:
mat_centered <- sweep(mat, MARGIN = 2, STATS = col_mins, FUN = "-")
- 计算列的极差(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
相关产品推荐
相关产品推荐

