特徵縮放 | 歸一化和標準化 (下)

前面 特徵縮放 | 歸一化和標準化 (上) 簡單介紹了 什麼是特徵縮放以及歸一化,這裏主要是涉及標準化 和一些特徵縮放的總結。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.當數據存在預測值或噪音時,可以使用標準化

相關文章
相關標籤/搜索