关于矩阵的归一化

本文讨论了矩阵列归一化的过程及其在Yang等人稀疏表示论文中的作用。通过对矩阵每一列进行归一化处理,使得每列元素平方和为1,进而形成对角线元素全为1的对称矩阵,这为后续处理提供了便利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看Yang大牛稀疏表示论文的代码,发现里面很多的操作的用到了矩阵的列归一化,这里谈一谈列归一化的实现,以及其带来的好处。

矩阵的列归一化,就是将矩阵每一列的值,除以每一列所有元素平方和开根号,这样做的结果就是,矩阵每一列元素的平方和为1了。

举个例子,矩阵[1,2,3]',将其归一化的结果就是[0.2673,0.5345,0.8018]。其平方和就为1了。

Yang在代码中,将那些平方和为0,以及平方和很小的列向量的剔除了,不用做训练,所以最后训练样本矩阵中的每一列就是一个训练图像块,行数代表了图像块的大小。

之前一直不清楚,为什么要做这么多的归一化,直到想到了对称矩阵(请原谅数学不好的我,在理解的路上磕磕绊绊)。

假设通过上述归一化处理的样本集合为X,x的没一列的平方和都是1,假设X是25*1000的一个矩阵好了,那么X‘为一个1000*25的矩阵,Yang等人的方法里用到了

A=X’*X。那么通过上面的那些变化,X的每列元素的平方和都是1,那么A的对角线元素都是1,且A是关于对角线对称的。那么A就是一个对角线元素全为1的对称矩阵,而实对称矩阵具有如下的性质:

这就为之后的处理奠定了基础。

<think>我们通常所说的矩阵归一化(Normalization)有多种形式,常见的包括:1.将矩阵的每个元素归一化到[0,1]区间:X_normalized=(X-X_min)/(X_max-X_min)2.将矩阵的每个元素归一化到[-1,1]区间:X_normalized=2*(X-X_min)/(X_max-X_min)-13.标准化(Standardization):将数据变换为均值为0,标准差为1的分布:X_normalized=(X-μ)/σ4.按行或列归一化,例如使得每行(列)的范数为1(常见的有L1范数、L2范数归一化)这里我将分别给出几种常见归一化的MATLAB代码实现,并解释每种归一化的适用场景。注意:在以下代码中,假设输入矩阵为A。</think>### 矩阵归一化详解 矩阵归一化是将矩阵数据转换到特定范围(通常是[0,1]或[-1,1])的过程,常用于数据预处理和特征缩放。以下是各种归一化方法的实现和解释: #### 1. 最小-最大归一化(Min-Max Scaling) 将值缩放到[0,1]区间: ```matlab function normalized_matrix = minmax_normalize(matrix) min_vals = min(matrix, [], 'all'); % 全局最小值 max_vals = max(matrix, [], 'all'); % 全局最大值 normalized_matrix = (matrix - min_vals) / (max_vals - min_vals); end ``` #### 2. Z-score标准化(Standardization) 将数据转换为均值为0、标准差为1的分布: ```matlab function standardized_matrix = zscore_normalize(matrix) mu = mean(matrix, 'all'); % 全局均值 sigma = std(matrix, 0, 'all'); % 全局标准差 standardized_matrix = (matrix - mu) / sigma; end ``` #### 3. 按行归一化 每行数据独立归一化: ```matlab function row_normalized = row_normalize(matrix) row_min = min(matrix, [], 2); % 每行最小值 row_max = max(matrix, [], 2); % 每行最大值 row_normalized = (matrix - row_min) ./ (row_max - row_min); % 处理常数行(分母为0) constant_rows = (row_max == row_min); row_normalized(constant_rows, :) = 0.5; % 设为中间值 end ``` #### 4. 按列归一化 每列数据独立归一化: ```matlab function col_normalized = col_normalize(matrix) col_min = min(matrix, [], 1); % 每列最小值 col_max = max(matrix, [], 1); % 每列最大值 col_normalized = (matrix - col_min) ./ (col_max - col_min); % 处理常数列 constant_cols = (col_max == col_min); col_normalized(:, constant_cols) = 0.5; end ``` #### 5. L2范数归一化(单位向量化) ```matlab function l2_normalized = l2_normalize(matrix) norms = sqrt(sum(matrix.^2, 2)); % 每行L2范数 l2_normalized = matrix ./ norms; % 处理零范数行 zero_norm = (norms == 0); l2_normalized(zero_norm, :) = 0; end ``` #### 6. 稳健归一化(Robust Scaling) 使用四分位数,对异常值不敏感: ```matlab function robust_normalized = robust_normalize(matrix) Q1 = quantile(matrix, 0.25, 'all'); % 第一四分位数 Q3 = quantile(matrix, 0.75, 'all'); % 第三四分位数 IQR = Q3 - Q1; % 四分位距 median_val = median(matrix, 'all'); % 中位数 robust_normalized = (matrix - median_val) / IQR; end ``` ### 应用示例 ```matlab % 创建示例矩阵 A = [1, 2, 3; 4, 5, 6; 10, 20, 30]; % 最小-最大归一化 norm_A = minmax_normalize(A); disp('Min-Max归一化结果:'); disp(norm_A); % Z-score标准化 z_A = zscore_normalize(A); disp('Z-score标准化结果:'); disp(z_A); % 按行归一化 row_norm_A = row_normalize(A); disp('按行归一化结果:'); disp(row_norm_A); ``` ### 归一化方法比较表 | 方法 | 公式 | 特点 | 适用场景 | |------|------|------|----------| | Min-Max | (x - min)/(max - min) | 结果在[0,1] | 图像处理、神经网络输入 | | Z-score | (x - μ)/σ | 均值0、方差1 | 机器学习、统计分析 | | L2范数 | x/||x||₂ | 向量长度为1 | 文本挖掘、余弦相似度 | | 按行归一化 | 每行独立缩放 | 保持行间关系 | 时间序列分析 | | 按列归一化 | 每列独立缩放 | 保持列间关系 | 特征工程 | | 稳健归一化 | (x - median)/IQR | 抗异常值 | 含离群值的数据集 | ### 归一化注意事项 1. **数据泄露问题**: ```matlab % 错误做法:使用测试集计算统计量 % 正确做法:保存训练集的统计量用于测试集 train_stats.min = min(train_matrix, [], 'all'); train_stats.max = max(train_matrix, [], 'all'); test_normalized = (test_matrix - train_stats.min) / (train_stats.max - train_stats.min); ``` 2. **稀疏矩阵处理**: ```matlab function sparse_normalize(sparse_mat) % 仅缩放非零元素 [rows, cols, vals] = find(sparse_mat); min_val = min(vals); max_val = max(vals); normalized_vals = (vals - min_val) / (max_val - min_val); normalized_mat = sparse(rows, cols, normalized_vals, ... size(sparse_mat,1), size(sparse_mat,2)); end ``` 3. **内存优化**: ```matlab function inplace_normalize(matrix) % 原地操作避免内存复制 min_val = min(matrix, [], 'all'); max_val = max(matrix, [], 'all'); matrix = matrix - min_val; matrix = matrix / (max_val - min_val); end ``` ### 逆归一化 ```matlab function original = inverse_minmax(normalized, min_val, max_val) original = normalized * (max_val - min_val) + min_val; end ``` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值