數據的標準化(normalization)是將數據按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中常常會用到,去除數據的單位限制,將其轉化爲無量綱的純數值,便於不一樣單位或量級的指標可以進行比較和加權。其中最典型的就是數據的歸一化處理,即將數據統一映射到[0,1]區間上。算法
目前數據標準化方法有多種,歸結起來能夠分爲直線型方法(如極值法、標準差法)、折線型方法(如三折線法)、曲線型方法(如半正態性分佈)。不一樣的標準化方法,對系統的評價結果會產生不一樣的影響,然而不幸的是,在數據標準化方法的選擇上,尚未通用的法則能夠遵循。dom
歸一化是一種簡化計算的方式,即將有量綱的表達式,通過變換,化爲無量綱的表達式,成爲純量。 好比,複數阻抗能夠歸一化書寫:$Z=R+j\omega L=R(1+j\omega L/R)$,複數部分變成了純數量了,沒有量綱。機器學習
另外,微波之中也就是電路分析、信號系統、電磁波傳輸等,有不少運算均可以如此處理,既保證了運算的便捷,又能凸現出物理量的本質含義。函數
1. 提高模型的收斂速度學習
以下圖,$x_1$的取值爲0-2000,而$x_2$的取值爲1-5,假如只有這兩個特徵,對其進行優化時,會獲得一個窄長的橢圓形,致使在梯度降低時,梯度的方向爲垂直等高線的方向而走之字形路線,這樣會使迭代很慢,相比之下,右圖的迭代就會很快(理解:也就是步長走多走少方向老是對的,不會走偏)。優化
2.提高模型的精度.net
歸一化的另外一好處是提升精度,這在涉及到一些距離計算的算法時效果顯著,好比算法要計算歐氏距離,上圖中$x_2$的取值範圍比較小,涉及到距離計算時其對結果的影響遠比$x_1$帶來的小,因此這就會形成精度的損失。因此歸一化頗有必要,他可讓各個特徵對結果作出的貢獻相同。3d
在多指標評價體系中,因爲各評價指標的性質不一樣,一般具備不一樣的量綱和數量級。當各指標間的水平相差很大時,若是直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的做用,相對削弱數值水平較低指標的做用。所以,爲了保證結果的可靠性,須要對原始指標數據進行標準化處理。orm
在數據分析以前,咱們一般須要先將數據標準化(normalization),利用標準化後的數據進行數據分析。數據標準化也就是統計數據的指數化。數據標準化處理主要包括數據同趨化處理和無量綱化處理兩個方面。數據同趨化處理主要解決不一樣性質數據問題,對不一樣性質指標直接加總不能正確反映不一樣做用力的綜合結果,須先考慮改變逆指標數據性質,使全部指標對測評方案的做用力同趨化,再加總才能得出正確結果。數據無量綱化處理主要解決數據的可比性。通過上述標準化處理,原始數據均轉換爲無量綱化指標測評值,即各指標值都處於同一個數量級別上,能夠進行綜合測評分析。blog
從經驗上說,歸一化是讓不一樣維度之間的特徵在數值上有必定比較性,能夠大大提升分類器的準確性。
3. 深度學習中數據歸一化能夠防止模型梯度爆炸。
1. 須要歸一化的模型:
有些模型在各個維度進行不均勻伸縮後,最優解與原來不等價,例如SVM(距離分界面遠的也拉近了,支持向量變多?)。對於這樣的模型,除非原本各維數據的分佈範圍就比較接近,不然必須進行標準化,以避免模型參數被分佈範圍較大或較小的數據dominate。2. 有些模型在各個維度進行不均勻伸縮後,最優解與原來等價,例如logistic regression(由於θ的大小原本就自學習出不一樣的feature的重要性吧?)。對於這樣的模型,是否標準化理論上不會改變最優解。可是,因爲實際求解每每使用迭代算法,若是目標函數的形狀太「扁」,迭代算法可能收斂得很慢甚至不收斂。因此對於具備伸縮不變性的模型,最好也進行數據標準化。
2. 不須要歸一化的模型:
機率模型不須要歸一化,由於它們不關心變量的值,而是關心變量的分佈和變量之間的條件機率,如決策樹、rf。而像adaboost、gbdt、xgboost、svm、lr、KNN、KMeans之類的最優化問題就須要歸一化。
對原始數據的線性變換,使結果落到[0,1]區間,轉換函數以下:
$${x^ * } = \frac{{x - {x_{min}}}}{{{x_{max}} - {x_{min}}}}.$$
其中$x_{max}$爲樣本數據的最大值,$x_{min}$爲樣本數據的最小值。
這種方法有一個缺陷就是當有新數據加入時,可能致使$x_{max}$和$x_{min}$的變化,須要從新定義。
最多見的標準化方法就是Z標準化,也是SPSS中最爲經常使用的標準化方法,spss默認的標準化方法就是z-score標準化。
也叫標準差標準化,這種方法給予原始數據的均值(mean)和標準差(standard deviation)進行數據的標準化。
通過處理的數據符合標準正態分佈,即均值爲0,標準差爲1,其轉化函數爲:
$$ {x^* } = \frac{{x - \mu }}{\sigma }. $$
這兩種最經常使用方法使用場景:
一、在分類、聚類算法中,須要使用距離來度量類似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。
二、在不涉及距離度量、協方差計算、數據不符合正太分佈的時候,可使用第一種方法或其餘歸一化方法。好比圖像處理中,將RGB圖像轉換爲灰度圖像後將其值限定在[0 255]的範圍。
緣由是使用第一種方法(線性變換後),其協方差產生了倍數值的縮放,所以這種方式沒法消除量綱對方差、協方差的影響,對PCA分析影響巨大;同時,因爲量綱的存在,使用不一樣的量綱、距離的計算結果會不一樣。
而在第二種歸一化方式中,新的數據因爲對方差進行了歸一化,這時候每一個維度的量綱其實已經等價了,每一個維度都服從均值爲0、方差1的正態分佈,在計算距離的時候,每一個維度都是去量綱化的,避免了不一樣量綱的選取對距離計算產生的巨大影響。
線性變換後協方差產生倍數值縮放推導以下:
假設數據爲2個維度$(X, Y)$,爲方便分析,取線性係數$c$,線性變換後的$x'$和$y'$分別爲:
$$x' = {c_x} \cdot x.$$
$$y' = {c_y} \cdot y.$$
計算協方差:
$${{\sigma '}_{xy}} = \frac{1}{n}\sum\limits_{i = 1}^n {\left( {{c_x}{x_i} - {c_x}\bar x} \right)} \left( {{c_y}{y_i} - {c_y}\bar y} \right) = {c_x}{c_y}{\sigma _{xy}} \ne {\sigma _{xy}}.$$
能夠看到,使用第一種方法(線性變換後),其協方差產生了${c_x}{c_y}$倍的縮放。
經過以10爲底的log函數轉換的方法一樣能夠實現歸一下,具體方法以下:
$${x^ * } = \frac{{{{log }_{10}}\left( x \right)}}{{{{log }_{10}}\left( {{x_{max }}} \right)}}.$$
看了下網上不少介紹都是${x^ * } = {log _{10}}\left( x \right)$,實際上是有問題的,這個結果並不是必定落到[0,1]區間上,應該還要除以${log _{10}}\left( {{x_{max }}} \right)$,$x_{max }$爲樣本數據最大值,而且全部的數據都要大於等於1。
用反正切函數也能夠實現數據的歸一化:
$$ {x^ * } = \frac{{atan \left( x \right) * 2}}{\pi }. $$
使用這個方法須要注意的是若是想映射的區間爲[0,1],則數據都應該大於等於0,小於0的數據將被映射到[-1,0]區間上,而並不是全部數據標準化的結果都映射到[0,1]區間上。
這種方法經過移動數據的小數點位置來進行標準化。小數點移動多少位取決於屬性$A$的取值中的最大絕對值。
將屬性$A$的原始值$x$使用decimal scaling標準化到$x^ * $的計算方法是:
$$x^ * =\frac{x}{10^j}.$$
其中,$j$是知足條件的最小整數。
例如,假定$A$的值由-986到917,$A$的最大絕對值爲986,爲使用小數定標標準化,咱們用每一個值除以1000(即,$j=3$),這樣,-986被規範化爲-0.986。
注意,標準化會對原始數據作出改變,所以須要保存所使用的標準化方法的參數,以便對後續的數據進行統一的標準化。
$$ {x^ * } = \frac{1}{2} + \frac{1}{2} \cdot sin \left( {\frac{{x - \frac{{{x_{max }} - {x_{min }}}}{2}}}{{{x_{max }} - {x_{min }}}} \cdot \pi } \right). $$
參考博客:
1. 數據標準化/歸一化normalization:https://blog.csdn.net/pipisorry/article/details/52247379.