在數據挖掘或機器學習中,輸入的數據來自於不同的數據源,其取值範圍、量綱不同,這時候我們需要對這些數據進行歸一化或稱作標準化。標準化後,將有利於提高機器學習初始化速度、提高演算法的收斂速度和精度,也可以消除特徵的量綱不同對模型的影響。
一、為什麼需要歸一化
歸一化指的是將數據按比例縮放,使之落入一個小的特定區間。主要有以下幾個原因:
1. 模型初始化速度
一旦確定好神經網路的架構後,其權重參數需要初始化,如果權重參數初始化太小,則整個神經網路的輸出太小,使得網路學習過程非常緩慢,需要更長時間的學習才能收斂。如果權重參數初始化太大,則整個神經網路的輸出太大,使得網路也無法學到更多的知識。那麼我們可以通過歸一化輸入數據,用一組更合適的初始權重,默認初始化而不是0初始化,從而加快初始化速度。
2. 提高演算法的收斂速度和精度
在神經網路中,一般使用梯度下降演算法進行反向傳播學習,而梯度下降演算法需要計算梯度值來取得最佳av_min(最小值),如果收斂慢,不僅會耗費更多的計算時間,而且很容易陷入局部最小值中。歸一化可以縮小特徵間的差異,使得收斂速度更快,且不易陷入局部最小值。
3. 消除特徵的量綱不同對模型的影響
在數據挖掘或機器學習中,輸入的數據往往來自不同的數據源,其取值範圍和量綱也不一致。例如身高和體重不在一個量綱。這會對模型產生影響,體現在模型的預測效果不佳,不能充分表達數據的意義。歸一化則可以減少特徵間的影響,增加模型的魯棒性。
二、常用的歸一化方法
1. Min-max歸一化
Min-max歸一化是對原始數據進行線性變換,將數據映射到[0, 1]區間內,其函數可表示為:
x = (x - min) / (max - min)
其中,x為每個數據的歸一化後的結果,min和max分別為特徵屬性中的最小值和最大值。
其中,一份簡單的python代碼實現樣例:
def min_max_scale(data):
"""Min-max scaling"""
return (data - np.min(data)) / (np.max(data) - np.min(data))
2. Z-score標準化
Z-score標準化是將原始數據轉化為均值為0,標準差為1的分布。其函數可表示為:
x = (x - mean) / std
其中,x為每個數據的標準化結果,mean為特徵屬性中的均值,std為標準差。
其中,一份簡單的python代碼實現樣例:
def z_score_scale(data):
"""Z-score scaling"""
return (data - np.mean(data)) / np.std(data)
三、反歸一化的實現
在訓練神經網路時,我們需要將歸一化後的結果映射到原來的取值範圍內,這個過程稱為反歸一化。反歸一化可以用於提取真實結果,判斷神經網路的預測效果。反歸一化的函數與歸一化是相反的。
1. 反Min-max歸一化
如果已知待反歸一化值$x’$、原本歸一化的最大值$max$和最小值$min$,則可以通過下式反推出$x$值:
x = x'* (max - min) + min
其中,一份簡單的python代碼實現樣例:
def inverse_min_max_scale(data, inverse_data):
"""Inverse Min-max scaling"""
min, max = np.min(data), np.max(data)
inv_data = inverse_data * (max - min) + min
return inv_data
2. 反Z-score標準化
如果已知待反歸一化值$x’$、原本歸一化的均值$mean$和標準差$std$,則可以通過下式反推出$x$值:
x = x' * std + mean
其中,一份簡單的python代碼實現樣例:
def inverse_z_score_scale(data, inverse_data):
"""Inverse Z-score scaling"""
mean, std = np.mean(data), np.std(data)
inv_data = inverse_data * std + mean
return inv_data
總結
歸一化與反歸一化在數據挖掘和機器學習中起著重要的作用。在歸一化方面,最常用的方法是Min-max歸一化和Z-score標準化;在反歸一化方面,只需要根據原本的歸一化計算方法,並將映射到[0, 1]或者均值為0,標準差為1的分布的結果再次還原回去即可。
原創文章,作者:VSZVB,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371369.html