Matlab系列(005) 一 归一化

目录

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]区间
公式:
X n o r m = x − m i n ( x ) m a x ( x ) − m i n ( x ) Xnorm= {{\frac{x-min(x)}{max(x)-min(x)}}} Xnorm=max(x)−min(x)x−min(x)

特点:

(1)对异常值敏感(最大值/最小值易受离群点影响)。

(2)适用于数据分布未知的情况。

代码:

matlab 复制代码
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]区间内。
公式:
X n o r m = x − m e a n ( x ) m a x ( x ) − m i n ( 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标准化,输出范围受限,减少数值问题。
代码:

matlab 复制代码
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)要求数据近似服从正态分布。
代码:

matlab 复制代码
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 鲁棒归一化

原理:使用四分位数代替极值,降低异常值影响。
公式:
X r o b u s t = x − M e d i a n ( x ) I Q R ( 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)忽略异常值但未处理​​:它只是降低了异常值的影响,但异常值仍然存在于数据中。
代码:

matlab 复制代码
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]区间。
公式:
X r o b u s t = x m a x ⁡ ( ∣ x ∣ ) Xrobust = {{\frac{x}{max⁡(∣x∣)}}} Xrobust=max⁡(∣x∣)x
特点:

(1)保留数据稀疏性(不会移动数据中心)

(2)适用于稀疏数据(如文本处理)
代码:

matlab 复制代码
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)对数变换
公式:
l o g d a t a = s i g n ( d a t a ) . ∗ l o g ( 1 + a b s ( d a t a ) ) log_data = sign(data) .* log(1 + abs(data)) logdata=sign(data).∗log(1+abs(data))

说明:支持负值
代码:

matlab 复制代码
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)反正切变换
公式:
a t a n d a t a = a t a n ( d a t a ) ∗ 2 / p i atan_data = atan(data) * 2 / pi atandata=atan(data)∗2/pi

说明:可以映射到[-1,1]
代码:

matlab 复制代码
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变换
公式:
s i g m o i d d a t a = 1. / ( 1 + e x p ( − d a t a ) ) sigmoid_data = 1 ./ (1 + exp(-data)) sigmoiddata=1./(1+exp(−data))
代码:

matlab 复制代码
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、总结

​   归一化作为数据预处理的基石,通过消除特征间的量纲差异和数量级影响,显著提升模型的性能和稳定性。没有"最好"的归一化方法,需根据数据特性和模型需求选择,不同应用场景下的方法选择策略。

相关推荐
云卓SKYDROID1 小时前
无人机延时模块技术难点解析
人工智能·无人机·高科技·云卓科技·延迟摄像
神齐的小马1 小时前
机器学习 [白板推导](十三)[条件随机场]
人工智能·机器学习
荼蘼1 小时前
CUDA安装,pytorch库安装
人工智能·pytorch·python
@Wufan2 小时前
【机器学习】7 Linear regression
人工智能·机器学习·线性回归
tainshuai2 小时前
从零开始理解 K 均值聚类:原理、实现与应用
机器学习·均值算法·聚类
cxr8282 小时前
自动化知识工作AI代理的工程与产品实现
运维·人工智能·自动化
stbomei3 小时前
基于 MATLAB 的信号处理实战:滤波、傅里叶变换与频谱分析
算法·matlab·信号处理
whaosoft-1433 小时前
51c自动驾驶~合集18
人工智能
即兴小索奇3 小时前
2025年AI Agent规模化落地:企业级市场年增超60%,重构商业作业流程新路径
人工智能·ai·商业·ai商业洞察·即兴小索奇
ReedFoley3 小时前
【笔记】动手学Ollama 第七章 应用案例1 搭建本地AI Copilot编程助手
人工智能·笔记·copilot