目錄
- 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))logd?ata=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 / piatand?ata=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))sigmoidd?ata=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、總結
? ??歸一化作為數據預處理的基石,通過消除特征間的量綱差異和數量級影響,顯著提升模型的性能和穩定性。沒有"最好"的歸一化方法,需根據數據特性和模型需求選擇,不同應用場景下的方法選擇策略。