一般做機器學習應用的時候大部分時間是花費在特徵處理上,其中很關鍵的一步就是對特徵數據進行歸一化,爲什麼要歸一化呢?
很多同學並未搞清楚,維基百科給出的解釋:
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)