前面 特徵縮放 | 歸一化和標準化 (上) 簡單介紹了 什麼是特徵縮放以及歸一化,這裏主要是涉及標準化 和一些特徵縮放的總結。html
什麼是標準化?python
標準化也是特徵縮放的另一種方式。它把數據歸一到均值爲0,方差爲1的分佈中。spa
如:orm
有一組樣本htm
(10個樣本*3個特徵)blog
將其標準化以後get
此時,特徵1的均值爲0,方差爲1;特徵2的均值爲0,方差也爲1。特徵3如是form
從計算結果的角度上看,標準化與歸一化的區別在於:歸一化以後全部數據被映射到0-1區間內。class
而標準化以後,全部數據的均值爲0,方差爲1(以列爲基準)import
標準化公式:
將特徵值減去特徵的均值 再除以特徵的標準差
Python 簡單實現
import numpy as np def standard_scaler(X): '''標準化''' assert X.ndim == 2,'X muse be ....' n_feature = X.shape[1] for n in range(n_feature): n_mean = np.mean(X[:,n]) n_std = np.std(X[:,n]) X[:,n] = (X[:,n] - n_mean) / n_std return X x_samples = np.linspace(0,15,15).reshape(5,3) #生成樣本數據 print('樣本集:\n',x_samples) x_samples = standard_scaler(x_samples) print('標準化:\n',x_samples) n_feature = x_samples.shape[1] for n in range(n_feature): print('第{}列的均值{},方差{}'.format(n,np.mean(x_samples[:,n]),np.var(x_samples[:,n])))
運行結果
樣本集: [[ 0. 1.07142857 2.14285714] [ 3.21428571 4.28571429 5.35714286] [ 6.42857143 7.5 8.57142857] [ 9.64285714 10.71428571 11.78571429] [12.85714286 13.92857143 15. ]] 標準化: [[-1.41421356e+00 -1.41421356e+00 -1.41421356e+00] [-7.07106781e-01 -7.07106781e-01 -7.07106781e-01] [ 1.95389284e-16 0.00000000e+00 0.00000000e+00] [ 7.07106781e-01 7.07106781e-01 7.07106781e-01] [ 1.41421356e+00 1.41421356e+00 1.41421356e+00]] 第0列的均值1.3322676295501878e-16,方差0.9999999999999997 第1列的均值-4.4408920985006264e-17,方差0.9999999999999997 第2列的均值-4.4408920985006264e-17,方差0.9999999999999997
從運行結果上看,均值皆幾乎接近於0,方差皆幾乎接近於1
sklearn API:
from sklearn.preprocessing import StandardScaler
總結:
1.歸一化的縮放與極值有關,因此容易受到極端值的干擾。其輸出範圍在[0,1]之間
2.標準化的縮放與均值、方差有關,其輸出範圍在負無窮到正無窮之間
3.當數據存在預測值或噪音時,可以使用標準化