文章目录
- 前言
- 一、 为什么需要标准化与归一化?
- 二、 核心方法及其MATLAB实现
-
-
- 标准化
-
- 最小-最大归一化
-
- 稳健标准化
-
- L2范数归一化(向量归一化)
-
- 三、 关键实践:训练集与测试集的处理流程
- 四、 方法选择指南
- 总结
前言
在多元数据分析与机器学习的实践中,我们常常会遇到一个关键挑战:数据集中的不同特征往往具有各异的量纲和数值范围。例如,在一个包含年龄、年收入和信用评分的客户数据集中,年龄的范围可能是20-80,年收入可能是30,000-200,000,而信用评分可能是300-850。这种尺度上的巨大差异会严重影响许多机器学习算法的性能------基于距离计算的算法(如K近邻、聚类分析)会被数值范围大的特征所主导;基于梯度下降的优化算法(如神经网络、逻辑回归)则会因为参数空间的不均衡而收敛缓慢。
为了解决这一问题,我们需要通过数据标准化 与归一化等技术,将不同特征的数值转换到统一的尺度上,同时保留原始数据所包含的关键信息。这不仅是一个技术步骤,更是确保模型公平对待每个特征、释放算法真正潜力的必要前提。MATLAB提供了一套完整而高效的工具集,使得这些预处理操作变得简单而直观。本文将深入探讨MATLAB中主要的数据缩放方法,阐明其原理、实现与应用场景。
一、 为什么需要标准化与归一化?
核心目标:消除特征间的量纲影响,创造公平的比较基础。
- 保证距离度量的公正性:在KNN、SVM、K-Means等算法中,尺度大的特征会主导距离计算,导致模型忽略尺度小但可能重要的特征。
- 加速梯度下降收敛:未经缩放的特征会导致损失函数的等高线呈狭长椭圆形,梯度下降路径会剧烈震荡,收敛缓慢。缩放后的等高线更接近圆形,路径更直接。
- 提升模型性能与稳定性:特别是对于依赖梯度计算的模型(如神经网络)和使用正则化的模型(如L1、L2),特征缩放能显著提高模型的精度和泛化能力。
- 增强算法数值稳定性:防止计算过程中因数值过大或过小而引发的浮点数溢出或下溢问题。
二、 核心方法及其MATLAB实现
1. 标准化
核心思想:将数据转换为均值为0、标准差为1的正态分布。
-
公式 :
z = \\frac{x - \\mu}{\\sigma}
其中,(\mu) 是特征值的均值,(\sigma) 是特征值的标准差。
-
MATLAB实现:
matlab% 使用 zscore 函数(最常用) data = [1000, 2000, 3000; 30, 40, 50; 0.1, 0.2, 0.3]'; % 一个3x3的示例数据 data_standardized = zscore(data); % 验证结果 mean_val = mean(data_standardized); % 应接近 [0, 0, 0] std_val = std(data_standardized); % 应接近 [1, 1, 1] -
适用场景:
- 数据分布近似正态分布,或分布未知。
- 算法假设数据均值为零(如PCA、LDA)。
- 数据中存在异常值(标准化对异常值有一定鲁棒性,因为标准差受异常值影响)。
2. 最小-最大归一化
核心思想:将数据线性地映射到一个指定的范围(通常是[0, 1])。
-
公式 :
x_{\\text{norm}} = \\frac{x - x_{\\min}}{x_{\\max} - x_{\\min}}
-
MATLAB实现:
matlab% 使用 rescale 函数(推荐) data_normalized = rescale(data, 0, 1); % 缩放到 [0, 1] % 手动实现 data_min = min(data); data_max = max(data); data_normalized_manual = (data - data_min) ./ (data_max - data_min); -
适用场景:
- 数据边界已知,且需要固定输出范围(如图像处理中的像素强度)。
- 数据分布不服从正态分布。
- 对不存在异常值的数据集进行处理(因为最小值和最大值对异常值极其敏感)。
3. 稳健标准化
核心思想:使用中位数和四分位数范围(IQR)进行缩放,对异常值不敏感。
-
公式 :
x_{\\text{robust}} = \\frac{x - \\text{Median}(x)}{\\text{IQR}(x)}
-
MATLAB实现:
matlab% 手动计算 data_median = median(data); data_iqr = iqr(data); % 计算四分位距 data_robust = (data - data_median) ./ data_iqr; -
适用场景:
- 数据中存在显著异常值。
- 需要更稳健的缩放方法,避免异常值对转换结果的扭曲。
4. L2范数归一化(向量归一化)
核心思想:将每个样本(行)转换为单位范数的向量。
-
公式 :
x_{\\text{unit}} = \\frac{x}{\|x\|_2}
-
MATLAB实现:
matlab% 使用 vecnorm 函数 norms = vecnorm(data, 2, 2); % 计算每行的L2范数 data_l2_normalized = data ./ norms; % 或者使用 normalize 函数 data_l2_normalized = normalize(data, 2, 'norm'); % 按行进行L2归一化 -
适用场景:
- 文本分类、词袋模型。
- 任何使用余弦相似度作为度量标准的场景。
三、 关键实践:训练集与测试集的处理流程
在机器学习中,一个至关重要的原则是:任何从数据中学习得到的参数(包括标准化/归一化的参数),都必须仅从训练集中计算,然后应用于测试集。 绝不允许使用测试集的信息来拟合预处理器。
正确的MATLAB工作流:
matlab
% 1. 分割数据
cv = cvpartition(size(data,1), 'HoldOut', 0.3);
idxTrain = training(cv);
idxTest = test(cv);
dataTrain = data(idxTrain, :);
dataTest = data(idxTest, :);
% 2. 从训练集中计算转换参数
mu_train = mean(dataTrain);
sigma_train = std(dataTrain);
% 3. 使用训练集参数转换训练集和测试集
dataTrain_std = (dataTrain - mu_train) ./ sigma_train;
dataTest_std = (dataTest - mu_train) ./ sigma_train; % 注意:使用训练集的mu和sigma!
% 如果使用Normalize函数,可以保存并复用预处理对象
[dataTrain_std, PS] = mapstd(dataTrain'); % 注意mapstd默认按行处理,所以需要转置
dataTest_std = mapstd('apply', dataTest', PS);
dataTest_std = dataTest_std'; % 转置回来
四、 方法选择指南
| 方法 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|
| 标准化 | 保留异常值信息,适用于大多数场景 | 对极端异常值仍敏感 | 线性模型、PCA、神经网络 |
| 最小-最大归一化 | 保留原始分布形状,输出范围固定 | 对异常值非常敏感 | 图像处理、神经网络输入层 |
| 稳健标准化 | 对异常值不敏感 | 不保留原始分布和范围 | 含有异常值的数据集 |
| L2归一化 | 适用于余弦相似度 | 改变了原始数据的相对关系 | 文本挖掘、推荐系统 |
总结
数据标准化与归一化是构建高效、公平机器学习模型不可或缺的预处理步骤。它们通过消除特征间的量纲差异,为算法提供了一个公平的竞争环境。
核心要点回顾:
- 理解差异 :标准化 致力于将数据转换为标准正态分布,关注数据的分布形状 ;而归一化 则专注于将数据压缩到特定的数值范围。
- 正确流程 :预处理参数必须严格从训练集中学习,并一致地应用于验证集和测试集,这是防止数据泄露、保证模型评估公正性的生命线。
- 场景化选择:没有绝对最优的方法。标准化因其通用性成为默认的起点;最小-最大归一化在需要固定输出范围时表现出色;而面对异常值时,稳健标准化则是更安全的选择。
- MATLAB工具链 :从简洁的
zscore、rescale,到灵活的normalize函数,再到可保存状态的mapstd,MATLAB提供了一整套从快速实验到生产部署的完整工具。