目录
- 1、前言
- 2、什么是归一化?
- 3、为什么要进行归一化
- 4、归一化方法详解与Matlab实现
- 5、总结
1、前言
归一化技术是数据预处理的核心环节,本文将深度解析主流归一化方法,提供可复现Matlab代码,并探讨其在各领域中的应用场景。
2、什么是归一化?
归一化是数据预处理的核心技术之一,它将不同量纲、不同数量级的特征数据转换到统一的数量范围。通过消除特征的量纲差异和数量级影响,归一化使数据具有可比性,为后续的数据分析和建模奠定基础。
3、为什么要进行归一化
3.1 消除量纲影响
不同特征可能有完全不同的量纲(如年龄(岁)vs 收入(万元)),直接计算会导致量纲大的特征主导结果。
3.2 加速模型收敛
梯度下降类算法中,归一化后的数据能使损失函数的等高线更接近圆形,大幅提高收敛速度。
3.3 提高模型精度
基于距离的算法(如KNN、SVM、K-Means)对特征尺度敏感,归一化可防止大范围特征淹没小范围特征。
3.4 避免数值问题
大数值可能导致计算溢出(如指数函数)或精度损失。
3.5 统一优化步长
各特征方向上的步长一致,提高优化效率。
4、归一化方法详解与Matlab实现
4.1 最小-最大归一化
原理:线性映射原始数据到[0,1]区间
公式:
Xnorm=x−min(x)max(x)−min(x)Xnorm= {{\frac{x-min(x)}{max(x)-min(x)}}}Xnorm=max(x)−min(x)x−min(x)
特点:
(1)对异常值敏感(最大值/最小值易受离群点影响)。
(2)适用于数据分布未知的情况。
代码:
clc
clear
close all
%%
data=[10,2,20,4, 30, 6, 40, 8];min_val = min(data);
max_val = max(data);
normalized_data = (data - min_val) ./ (max_val - min_val);disp('最小-最大归一化结果:');
disp(normalized_data);
%%
%结果
最小-最大归一化结果:0.2105 0 0.4737 0.0526 0.7368 0.1053 1.0000 0.1579
4.2 均值归一化
原理:均值归一化是数据预处理中常用的一种归一化技术,将数据范围限制在[-1,1]区间内。
公式:
Xnorm=x−mean(x)max(x)−min(x)Xnorm= {{\frac{x-mean(x)}{max(x)-min(x)}}}Xnorm=max(x)−min(x)x−mean(x)
特点:
(1)相比最小-最大归一化,均值归一化保留了数据的分布形状。
(2)使数据均值为0,有利于许多机器学习算法。
(3)适用于同时包含正负值的数据集。
(4)相比Z-score标准化,输出范围受限,减少数值问题。
代码:
clc
clear
close all
%%data=[10,2,20,4, 30, 6, 40, 8];min_val = min(data);
max_val = max(data);normalized_data = (data - mean(data)) ./ (max_val - min_val);disp('均值归一化结果:');
disp(normalized_data);
%%
%结果
均值归一化结果:-0.1316 -0.3421 0.1316 -0.2895 0.3947 -0.2368 0.6579 -0.1842
4.3 Z-Score标准归一化
原理:将数据转换为均值为0、标准差为1的分布。
公式:
z=x−μσz = {{\frac{x-μ}{σ}}}z=σx−μ
解释:
x:原始数据。
μ:数据的均值。
σ:标准差。
特点:
(1)对异常值有一定鲁棒性。
(2)输出范围不受限。
(3)要求数据近似服从正态分布。
代码:
clc
clear
close all
%%
data=[10,2,20,4, 30, 6, 40, 8];
% 使用示例:
mu = mean(data);
sigma = std(data,1);
z_data = (data - mu) ./ sigma;disp('Z-Score标准归一化结果:');
disp(z_data);
%结果
Z-Score标准归一化结果:-0.3892 -1.0120 0.3892 -0.8563 1.1677 -0.7006 1.9462 -0.5449
4.4 鲁棒归一化
原理:使用四分位数代替极值,降低异常值影响。
公式:
Xrobust=x−Median(x)IQR(x)Xrobust = {{\frac{x-Median(x)}{IQR(x)}}}Xrobust=IQR(x)x−Median(x)
解释:
(1)x:原始数据。
(2)Median(x):数据的中位数。
(3)IQR(X):四分位距。它是上四分位数与下四分位数之差。
特点:
(1)异常值鲁棒性:最大优点,在数据包含异常值或存在重尾分布时表现卓越。
(2)保留信息:不会像删除异常值那样造成信息损失。
(3)中位数和IQR的可解释性:这些统计量比均值和方差更易于理解。
(4)输出范围不固定:转换后的数据没有固定的范围(如[0,1]),这对于某些需要严格输入范围的算法(如神经网络)可能是个问题。
(5) 对数据分布敏感:如果数据的中间50%(Q1到Q3)不能代表数据的整体分布,鲁棒缩放可能效果不佳。
(6)不适用于小数据集:四分位数的计算在小数据集上可能不稳定。
(7)忽略异常值但未处理:它只是降低了异常值的影响,但异常值仍然存在于数据中。
代码:
clc
clear
close all
%%
% 使用示例(含异常值):
data=[10,2,20,4, 30, 6, 40, 8];
robust_data = robust_norm(data);
disp('鲁棒归一化结果:');
disp(robust_data);function robust_data = robust_norm(data)median_val = median(data);Q1 = quantile(data, 0.25);Q3 = quantile(data, 0.75);IQR = Q3 - Q1;% 处理IQR为0的列IQR(IQR == 0) = 1;robust_data = (data - median_val) ./ IQR;
end
%结果
鲁棒归一化结果:0.0500 -0.3500 0.5500 -0.2500 1.0500 -0.1500 1.5500 -0.0500
4.5 最大绝对值缩放
原理:将数据按特征最大绝对值缩放至[-1,1]区间。
公式:
Xrobust=xmax(∣x∣)Xrobust = {{\frac{x}{max(∣x∣)}}}Xrobust=max(∣x∣)x
特点:
(1)保留数据稀疏性(不会移动数据中心)
(2)适用于稀疏数据(如文本处理)
代码:
clc
clear
close all
%%
% 使用示例:
data=[10,2,20,4, 30, 6, 40, 8];
maxabs_data = maxabs_norm(data);
disp('最大绝对值缩放结果:');
disp(maxabs_data);function maxabs_data = maxabs_norm(data)max_abs = max(abs(data));% 处理全零列max_abs(max_abs == 0) = 1;maxabs_data = data ./ max_abs;
end
%结果
最大绝对值缩放结果:0.2500 0.0500 0.5000 0.1000 0.7500 0.1500 1.0000 0.2000
4.6 非线性归一化方法
除了上述的线性归一化,还有非线性归一化。非线性归一化是指通过非线性函数对数据进行变换,其目的不仅是改变数据的尺度和中心,更重要的是改变数据的分布形状(如偏度、峰度)。与线性归一化只是进行缩放和平移不同,非线性变换能够压缩分布的一端、拉伸另一端,从而更好地满足模型的假设或揭示数据的内在结构。
(1)对数变换
公式:
logdata=sign(data).∗log(1+abs(data))log_data = sign(data) .* log(1 + abs(data))logdata=sign(data).∗log(1+abs(data))
说明:支持负值
代码:
clc
clear
close all
%%
% 使用示例:
data=[10,2,20,4, 30, 6, 40, 8];
log_data = sign(data) .* log(1 + abs(data));
disp('对数变换:');
disp(log_data);
%结果
对数变换:2.3979 1.0986 3.0445 1.6094 3.4340 1.9459 3.7136 2.1972
(2)反正切变换
公式:
atandata=atan(data)∗2/piatan_data = atan(data) * 2 / piatandata=atan(data)∗2/pi
说明:可以映射到[-1,1]
代码:
clc
clear
close all
%%
% 使用示例:
data=[10,2,20,4, 30, 6, 40, 8];
atan_data = atan(data) * 2 / pi;
disp('反正切变换:');
disp(atan_data);
%结果:
反正切变换:0.9365 0.7048 0.9682 0.8440 0.9788 0.8949 0.9841 0.9208
(3) Sigmoid变换
公式:
sigmoiddata=1./(1+exp(−data))sigmoid_data = 1 ./ (1 + exp(-data))sigmoiddata=1./(1+exp(−data))
代码:
clc
clear
close all
%%
% 使用示例:
data=[10,2,20,4, 30, 6, 40, 8];
sigmoid_data = 1 ./ (1 + exp(-data));disp('反正切变换:');
disp(sigmoid_data);
%结果:
Sigmoid变换:1.0000 0.8808 1.0000 0.9820 1.0000 0.9975 1.0000 0.9997
5、总结
归一化作为数据预处理的基石,通过消除特征间的量纲差异和数量级影响,显著提升模型的性能和稳定性。没有"最好"的归一化方法,需根据数据特性和模型需求选择,不同应用场景下的方法选择策略。