有時候我們在拿到原始數據的時候,我們不能直接使用。大概場景有下面這些,我遇到的
1. 數字比較大,容易爆計算量,更不容易收斂
2. 比如房子價格這種變量,並不是正態分布,有時候不利於我們做一些和正態分布有關系的線性模型分析,
那這個時候,我們可能需要對數據做一些預處理的工作。
數據的標准化(normalization)和歸一化
數據的標准化(normalization)是將數據按比例縮放,使之落入一個小的特定區間。在某些比較和評價的指標處理中經常會用到,去除數據的單位限制,將其轉化為無量綱的純數值,便於不同單位或量級的指標能夠進行比較和加權。
目前數據標准化方法有多種,歸結起來可以分為直線型方法(如極值法、標准差法)、折線型方法(如三折線法)、曲線型方法(如半正態性分布)。不同的標准化方法,對系統的評價結果會產生不同的影響,然而不幸的是,在數據標准化方法的選擇上,還沒有通用的法則可以遵循。
其中最典型的就是數據的歸一化處理,即將數據統一映射到[0,1]區間上。
歸一化的目標
1 把數變為(0,1)之間的小數
主要是為了數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速,應該歸到數字信號處理范疇之內。
2 把有量綱表達式變為無量綱表達式
歸一化是一種簡化計算的方式,即將有量綱的表達式,經過變換,化為無量綱的表達式,成為純量。 比如,復數阻抗可以歸一化書寫:Z = R + jωL = R(1 + jωL/R) ,復數部分變成了純數量了,沒有量綱。
另外,微波之中也就是電路分析、信號系統、電磁波傳輸等,有很多運算都可以如此處理,既保證了運算的便捷,又能凸現出物理量的本質含義。
歸一化后有兩個好處
1. 提升模型的收斂速度
如下圖,x1的取值為0-2000,而x2的取值為1-5,假如只有這兩個特征,對其進行優化時,會得到一個窄長的橢圓形,導致在梯度下降時,梯度的方向為垂直等高線的方向而走之字形路線,這樣會使迭代很慢,相比之下,右圖的迭代就會很快(理解:也就是步長走多走少方向總是對的,不會走偏)
2.提升模型的精度
歸一化的另一好處是提高精度,這在涉及到一些距離計算的算法時效果顯著,比如算法要計算歐氏距離,上圖中x2的取值范圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特征對結果做出的貢獻相同。
在多指標評價體系中,由於各評價指標的性質不同,通常具有不同的量綱和數量級。當各指標間的水平相差很大時,如果直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的作用,相對削弱數值水平較低指標的作用。因此,為了保證結果的可靠性,需要對原始指標數據進行標准化處理。
在數據分析之前,我們通常需要先將數據標准化(normalization),利用標准化后的數據進行數據分析。數據標准化也就是統計數據的指數化。數據標准化處理主要包括數據同趨化處理和無量綱化處理兩個方面。數據同趨化處理主要解決不同性質數據問題,對不同性質指標直接加總不能正確反映不同作用力的綜合結果,須先考慮改變逆指標數據性質,使所有指標對測評方案的作用力同趨化,再加總才能得出正確結果。數據無量綱化處理主要解決數據的可比性。經過上述標准化處理,原始數據均轉換為無量綱化指標測評值,即各指標值都處於同一個數量級別上,可以進行綜合測評分析。
從經驗上說,歸一化是讓不同維度之間的特征在數值上有一定比較性,可以大大提高分類器的准確性。
3. 深度學習中數據歸一化可以防止模型梯度爆炸。
常見的數據歸一化方法
最常用的是 min-max標准化 和 z-score 標准化。
min-max標准化(Min-max normalization)/0-1標准化(0-1 normalization)/線性函數歸一化/離差標准化
是對原始數據的線性變換,使結果落到[0,1]區間,轉換函數如下:
其中max為樣本數據的最大值,min為樣本數據的最小值。
def Normalization(x):
return [(float(i)-min(x))/float(max(x)-min(x)) for i in x]
如果想要將數據映射到[-1,1],則將公式換成:
x* = x* * 2 -1
或者進行一個近似
x* = (x - x_mean)/(x_max - x_min), x_mean表示數據的均值。
def Normalization2(x):
return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]
這種方法有一個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。
ps: 將數據歸一化到[a,b]區間范圍的方法:
(1)首先找到原本樣本數據X的最小值Min及最大值Max
(2)計算系數:k=(b-a)/(Max-Min)
(3)得到歸一化到[a,b]區間的數據:Y=a+k(X-Min) 或者 Y=b+k(X-Max)
即一個線性變換,在坐標上就是求直線方程,先求出系數,代入一個點對應的值(x的最大/最小就對應y的最大/最小)就ok了。
z-score 標准化(zero-mean normalization)
最常見的標准化方法就是Z標准化,也是SPSS中最為常用的標准化方法,spss默認的標准化方法就是z-score標准化。
也叫標准差標准化,這種方法給予原始數據的均值(mean)和標准差(standard deviation)進行數據的標准化。
經過處理的數據符合標准正態分布,即均值為0,標准差為1,注意,一般來說z-score不是歸一化,而是標准化,歸一化只是標准化的一種[lz]。
其轉化函數為:
x* = (x - μ ) / σ
其中μ為所有樣本數據的均值,σ為所有樣本數據的標准差。
z-score標准化方法適用於屬性A的最大值和最小值未知的情況,或有超出取值范圍的離群數據的情況。該種標准化方式要求原始數據的分布可以近似為高斯分布,否則效果會變得很糟糕。
標准化的公式很簡單,步驟如下
1.求出各變量(指標)的算術平均值(數學期望)xi和標准差si ;
2.進行標准化處理:
zij=(xij-xi)/si
其中:zij為標准化后的變量值;xij為實際變量值。
3.將逆指標前的正負號對調。
標准化后的變量值圍繞0上下波動,大於0說明高於平均水平,小於0說明低於平均水平。
為什么z-score 標准化后的數據標准差為1?
x-μ只改變均值,標准差不變,所以均值變為0
(x-μ)/σ只會使標准差除以σ倍,所以標准差變為1
這兩種最常用方法使用場景:
1、在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,第二種方法(Z-score standardization)表現更好。
2、在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用第一種方法或其他歸一化方法。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。
原因是使用第一種方法(線性變換后),其協方差產生了倍數值的縮放,因此這種方式無法消除量綱對方差、協方差的影響,對PCA分析影響巨大;同時,由於量綱的存在,使用不同的量綱、距離的計算結果會不同。而在第二種歸一化方式中,新的數據由於對方差進行了歸一化,這時候每個維度的量綱其實已經等價了,每個維度都服從均值為0、方差1的正態分布,在計算距離的時候,每個維度都是去量綱化的,避免了不同量綱的選取對距離計算產生的巨大影響。
log函數轉換
通過以10為底的log函數轉換的方法同樣可以實現歸一下,具體方法如下:
看了下網上很多介紹都是x*=log10(x),其實是有問題的,這個結果並非一定落到[0,1]區間上,應該還要除以log10(max),max為樣本數據最大值,並且所有的數據都要大於等於1。
atan函數轉換
用反正切函數也可以實現數據的歸一化。
使用這個方法需要注意的是如果想映射的區間為[0,1],則數據都應該大於等於0,小於0的數據將被映射到[-1,0]區間上,而並非所有數據標准化的結果都映射到[0,1]區間上。
Decimal scaling小數定標標准化
這種方法通過移動數據的小數點位置來進行標准化。小數點移動多少位取決於屬性A的取值中的最大絕對值。
將屬性A的原始值x使用decimal scaling標准化到x'的計算方法是:
x'=x/(10^j)
其中,j是滿足條件的最小整數。
例如 假定A的值由-986到917,A的最大絕對值為986,為使用小數定標標准化,我們用每個值除以1000(即,j=3),這樣,-986被規范化為-0.986。
注意,標准化會對原始數據做出改變,因此需要保存所使用的標准化方法的參數,以便對后續的數據進行統一的標准化。
常用的轉換,往往不需要我們直接寫,直接可以調用:Sci-kit Learn里面的 Preprocessing Data即可,當然你想自己寫也可以,也不難,別寫錯了就行了
轉載From: http://blog.csdn.net/pipisorry/article/details/52247679