MATLAB数据归一化算法通用实现
项目简介
本项目提供了一套完整且高效的 MATLAB 源代码,专门用于实现数据挖掘、机器学习和神经网络训练中核心的数据预处理步骤——归一化(Normalization)和标准化(Standardization)。
该实现不仅包含了三种主流的归一化算法,还重点解决了实际工程中的痛点:即如何保存“训练集”的归一化参数,并将其准确应用到“测试集”或“新样本”中,以及如何将处理后的数据反向还原为原始量纲。代码经过向量化优化,能够高效处理多维矩阵数据。
功能特性
- 多种归一化算法:集成了最小-最大归一化、Z-score 标准化和小数定标归一化。
- 参数分离与复用:算法在处理数据的同时返回参数结构体(包含均值、极值、缩放因子等),支持对新数据应用完全相同的变换规则。
- 反归一化支持:提供逆运算功能,可将归一化后的数据无损(或极低误差)还原为原始数据,便于后续结果分析。
- 鲁棒性设计:内置防除零机制,能够处理特征值完全相同(方差为0)的特殊情况。
- 可视化评估:自动生成散点图和箱线图,直观对比不同归一化方法对数据分布的影响。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外工具箱(仅使用 MATLAB 基础函数)
核心算法与实现逻辑
本项目的主程序通过以下流程演示了归一化算法的完整生命周期,代码逻辑严格对应实际业务场景:
1. 模拟数据生成
程序首先生成一个 100行 x 3列 的样本矩阵,模拟具有不同物理量纲的特征:
- 特征1:大数值范围(1000 ~ 5000)。
- 特征2:微小数值范围(0.01 ~ 0.1)。
- 特征3:正负交替且分布广泛的数据(均值-50,标准差200)。
- 通过
rng 固定种子,确保每次运行结果一致。
2. 最小-最大归一化 (Min-Max Normalization)
- 原理:通过线性变换将数据映射到 [0, 1] 区间。
- 实现细节:
* 计算每一列的最小值和最大值。
* 使用
repmat 函数扩展极值向量,通过矩阵运算加速处理。
* 将计算出的
input_min 和
input_max 封装到参数结构体中。
* 进行反归一化测试,验证还原误差级(通常在 1e-15 量级)。
3. Z-score 标准化 (Zero-Mean Normalization)
- 原理:利用原始数据的均值和标准差,将数据转换为均值为0、标准差为1的标准正态分布。
- 实现细节:
* 计算每列的均值 ($mu$) 和标准差 ($sigma$)。
* 加入微小量
1e-8 防止标准差为0时发生除以零错误。
* 保存
mean 和
std 参数供后续使用。
4. 小数定标归一化 (Decimal Scaling)
- 原理:通过移动小数点的位置进行缩放,使所有数据的绝对值小于1。
- 实现细节:
* 寻找每列绝对值的最大值。
* 计算使得最大值小于1的最小整数次方 $j$(即 $10^j$)。
* 保存幂次
power 和缩放因子
scale_factor。
5. 新数据应用 (模拟预测阶段)
模拟模型上线后的场景:
- 创建了2个全新的样本数据。
- 关键逻辑:不重新计算新数据的均值或极值,而是直接调用之前保存的
mm_params 和 zs_params。 - 确保了训练数据和推理数据处于完全相同的特征空间。
6. 结果可视化
程序最后会生成两个图表窗口:
- 散点图对比:选取特征1和特征3,展示原始数据与三种归一化后的数据在空间分布上的形状变化(形状保持或拉伸)。
- 箱线图对比:展示归一化前后数据取值范围的剧烈变化,体现消除量纲差异的效果。
关键代码细节分析
向量化运算
代码完全避免了低效的
for 循环遍历样本。通过
min(data, [], 1) 按列计算统计量,并配合
repmat 将统计量向量扩展为与数据同维度的矩阵,利用 MATLAB 的矩阵点除 (
./) 和点乘 (
.*) 实现并行计算,极大地提高了处理大规模数据的速度。
异常处理
在计算除数(如极差
max-min 或标准差
std)时,代码显式检查了零值:
diff(diff == 0) = 1e-8;
这防止了当某个特征所有样本值都相同时(即无信息量的特征)程序崩溃或产生
NaN,增强了算法的鲁棒性。
统一的接口设计
apply_normalization 和
apply_reverse 函数采用了通用的接口设计。它们接收数据矩阵和参数结构体,内部通过
switch-case 语句根据
params.type 自动判断应执行哪种算法。这种设计模式使得代码易于扩展新的归一化方法。
使用方法
- 直接在 MATLAB 环境中运行主脚本(无需任何参数)。
- 控制台将输出:
* 原始数据的统计信息。
* 三种归一化后的数据统计信息。
* 反归一化的误差检测结果。
* 模拟新数据应用参数后的转换结果。
- 程序将弹出图形窗口,展示归一化前后的分布对比。