機器學習的歸一化和標準化

一般做機器學習應用的時候大部分時間是花費在特徵處理上,其中很關鍵的一步就是對特徵數據進行歸一化,爲什麼要歸一化呢?

很多同學並未搞清楚,維基百科給出的解釋:

1)歸一化後加快了梯度下降求最優解的速度, 主要是加快梯度下降法收斂速度。

2)歸一化有可能提高精度。下面我簡單擴展解釋下這兩點。

 

1.歸一化

有兩種實現方法:

(1)常用的方法是通過對原始數據進行線性變換把數據映射到[0,1]之間,變換函數爲:

其中max爲樣本數據的最大值,min爲樣本數據的最小值。

缺點:這種方法有個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。

  另外,最大值與最小值非常容易受異常點影響,

  所以這種方法魯棒性較差,只適合傳統精確小數據場景

 

2. 標準化

常用的方法是z-score標準化,經過處理後的數據均值爲0,標準差爲1,處理方法是:

其中,其中μ是樣本的均值, σ是樣本的標準差。

特點: 該種歸一化方式要求原始數據的分佈可以近似爲高斯分佈,否則標準化的效果會變得很糟糕。它們可以通過現有樣本進行估計。

在已有樣本足夠多的情況下比較穩定,適合現代大數據場景。

以上爲兩種比較普通但是常用的歸一化技術,那這兩種歸一化的應用場景是怎麼樣的呢?下面做一個簡要的分析概括:

1、在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。

2、在不涉及距離度量、協方差計算、數據不符合正太分佈的時候,可以使用第一種方法或其他歸一化方法。比如圖像處理中,將RGB圖像轉換爲灰度圖像後將其值限定在[0 255]的範圍。

import numpy as np
import pandas as pd

def standardize(X):
    m, n = X.shape
    for j in range(n):
        features = X[:,j]
        meanVal = features.mean(axis=0)
        std = features.std(axis=0)
        if std != 0:
            X[:, j] = (features-meanVal)/std
        else:
            X[:, j] = 0
    return X

def normalize(X):
    m, n = X.shape
    for j in range(n):
        features = X[:,j]
        minVal = features.min(axis=0)
        maxVal = features.max(axis=0)
        diff = maxVal - minVal
        if diff != 0:
           X[:,j] = (features-minVal)/diff
        else:
           X[:,j] = 0
    return X

result = pd.read_table(r'E:\Python\resource\house.txt',sep='\s+')
X=result.as_matrix()
normResult = normalize(X)
standardResult = standardize(X)
print(normResult)
print(standardResult)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章