1. 程式人生 > >歸一化 (Normalization)、標準化 (Standardization)和中心化/零均值化 (Zero-centered)

歸一化 (Normalization)、標準化 (Standardization)和中心化/零均值化 (Zero-centered)

1 概念   歸一化:1)把資料變成(0,1)或者(1,1)之間的小數。主要是為了資料處理方便提出來的,把資料對映到0~1範圍之內處理,更加便捷快速。2)把有量綱表示式變成無量綱表示式,便於不同單位或量級的指標能夠進行比較和加權。歸一化是一種簡化計算的方式,即將有量綱的表示式,經過變換,化為無量綱的表示式,成為純量。   標準化:在機器學習中,我們可能要處理不同種類的資料,例如,音訊和圖片上的畫素值,這些資料可能是高維度的,資料標準化後會使每個特徵中的數值平均變為0(將每個特徵的值都減掉原始資料中該特徵的平均)、標準差變為1,這個方法被廣泛的使用在許多機器學習演算法中(例如:支援向量機、邏輯迴歸和類神經網路)。   中心化:平均值為0,對標準差無要求   歸一化和標準化的區別:歸一化是將樣本的特徵值轉換到同一量綱下把資料對映到[0,1]或者[-1, 1]區間內,僅由變數的極值決定,因區間放縮法是歸一化的一種。標準化是依照特徵矩陣的列處理資料,其通過求z-score的方法,轉換為標準正態分佈,和整體樣本分佈相關,每個樣本點都能對標準化產生影響。它們的相同點在於都能取消由於量綱不同引起的誤差;都是一種線性變換,都是對向量X按照比例壓縮再進行平移。   標準化和中心化的區別:標準化是原始分數減去平均數然後除以標準差,中心化是原始分數減去平均數。 所以一般流程為先中心化再標準化。   無量綱:我的理解就是通過某種方法能去掉實際過程中的單位,從而簡化計算。

2 為什麼要歸一化/標準化?   如前文所說,歸一化/標準化實質是一種線性變換,線性變換有很多良好的性質,這些性質決定了對資料改變後不會造成“失效”,反而能提高資料的表現,這些性質是歸一化/標準化的前提。比如有一個很重要的性質:線性變換不會改變原始資料的數值排序。 (1)某些模型求解需要   1)在使用梯度下降的方法求解最優化問題時, 歸一化/標準化後可以加快梯度下降的求解速度,即提升模型的收斂速度。如左圖所示,未歸一化/標準化時形成的等高線偏橢圓,迭代時很有可能走“之”字型路線(垂直長軸),從而導致迭代很多次才能收斂。而如右圖對兩個特徵進行了歸一化,對應的等高線就會變圓,在梯度下降進行求解時能較快的收斂。

橢圓等高線和圓形等高線

梯度下降軌跡

  2)一些分類器需要計算樣本之間的距離(如歐氏距離),例如KNN。如果一個特徵值域範圍非常大,那麼距離計算就主要取決於這個特徵,從而與實際情況相悖(比如這時實際情況是值域範圍小的特徵更重要)。

(2)無量綱化   例如房子數量和收入,因為從業務層知道,這兩者的重要性一樣,所以把它們全部歸一化。 這是從業務層面上作的處理。

(3)避免數值問題   太大的數會引發數值問題。

3 資料預處理時 3.1 歸一化 (1)Min-Max Normalization    x' = (x - X_min) / (X_max - X_min)

(2)平均歸一化    x' = (x - μ) / (MaxValue - MinValue)   (1)和(2)有一個缺陷就是當有新資料加入時,可能導致max和min的變化,需要重新定義。

(3)非線性歸一化   1)對數函式轉換:y = log10(x)   2)反餘切函式轉換:y = atan(x) * 2 / π   (3)經常用在資料分化比較大的場景,有些數值很大,有些很小。通過一些數學函式,將原始值進行對映。該方法包括 log、指數,正切等。需要根據資料分佈的情況,決定非線性函式的曲線,比如log(V, 2)還是log(V, 10)等。

3.2 標準化 (1)Z-score規範化(標準差標準化 / 零均值標準化)   x' = (x - μ)/σ

3.3 中心化   x' = x - μ

4 什麼時候用歸一化?什麼時候用標準化?   (1)如果對輸出結果範圍有要求,用歸一化。   (2)如果資料較為穩定,不存在極端的最大最小值,用歸一化。   (3)如果資料存在異常值和較多噪音,用標準化,可以間接通過中心化避免異常值和極端值的影響。   某知乎答主的回答提到了他個人經驗:一般來說,我個人建議優先使用標準哈。對於輸出有要求時再嘗試別的方法,如歸一化或者更加複雜的方法。很多方法都可以將輸出範圍調整到[0, 1],如果我們對於資料的分佈有假設的話,更加有效的方法是使用相對應的概率密度函式來轉換。讓我們以高斯分佈為例,我們可以首先計算高斯誤差函式(Gaussian Error Function),此處定為er fc(·),那麼可以用下式進行轉化:

  這篇部落格提到他的經驗:1) 在分類、聚類演算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。2) 在不涉及距離度量、協方差計算、資料不符合正太分佈的時候,可以使用第一種方法或其他歸一化方法。比如影象處理中,將RGB影象轉換為灰度影象後將其值限定在[0 255]的範圍。

5 哪些模型必須歸一化/標準化? (1)SVM   不同的模型對特徵的分佈假設是不一樣的。比如SVM 用高斯核的時候,所有維度共用一個方差,這不就假設特徵分佈是圓的麼,輸入橢圓的就坑了人家,所以簡單的歸一化都還不夠好,來杯白化才有勁。比如用樹的時候就是各個維度各算各的切分點,沒所謂。

(2)KNN   需要度量距離的模型,一般在特徵值差距較大時,都會進行歸一化/標準化。不然會出現“大數吃小數”。

(3)神經網路   1)數值問題   歸一化/標準化可以避免一些不必要的數值問題。輸入變數的數量級未致於會引起數值問題吧,但其實要引起也並不是那麼困難。因為tansig(tanh)的非線性區間大約在[-1.7,1.7]。意味著要使神經元有效,tansig( w1x1 + w2x2 +b) 裡的 w1x1 +w2x2 +b 數量級應該在 1 (1.7所在的數量級)左右。這時輸入較大,就意味著權值必須較小,一個較大,一個較小,兩者相乘,就引起數值問題了。   假如你的輸入是421,你也許認為,這並不是一個太大的數,但因為有效權值大概會在1/421左右,例如0.00243,那麼,在matlab裡輸入 421·0.00243 == 0.421·2.43,會發現不相等,這就是一個數值問題。

  2)求解需要   a. 初始化:在初始化時我們希望每個神經元初始化成有效的狀態,tansig函式在[-1.7, 1.7]範圍內有較好的非線性,所以我們希望函式的輸入和神經元的初始化都能在合理的範圍內使得每個神經元在初始時是有效的。(如果權值初始化在[-1,1]且輸入沒有歸一化且過大,會使得神經元飽和)   b. 梯度:以輸入-隱層-輸出這樣的三層BP為例,我們知道對於輸入-隱層權值的梯度有2ew(1-a^2)*x的形式(e是誤差,w是隱層到輸出層的權重,a是隱層神經元的值,x是輸入),若果輸出層的數量級很大,會引起e的數量級很大,同理,w為了將隱層(數量級為1)映身到輸出層,w也會很大,再加上x也很大的話,從梯度公式可以看出,三者相乘,梯度就非常大了。這時會給梯度的更新帶來數值問題。   c. 學習率:由(2)中,知道梯度非常大,學習率就必須非常小,因此,學習率(學習率初始值)的選擇需要參考輸入的範圍,不如直接將資料歸一化,這樣學習率就不必再根據資料範圍作調整。 隱層到輸出層的權值梯度可以寫成 2ea,而輸入層到隱層的權值梯度為 2ew(1-a^2)x ,受 x 和 w 的影響,各個梯度的數量級不相同,因此,它們需要的學習率數量級也就不相同。對w1適合的學習率,可能相對於w2來說會太小,若果使用適合w1的學習率,會導致在w2方向上步進非常慢,會消耗非常多的時間,而使用適合w2的學習率,對w1來說又太大,搜尋不到適合w1的解。如果使用固定學習率,而資料沒歸一化,則後果可想而知。   d.搜尋軌跡:已解釋    (4)PCA

作者:BruceACat 連結:https://www.jianshu.com/p/95a8f035c86c 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。