1. 程式人生 > >梯度下降中的歸一化、標準化問題

梯度下降中的歸一化、標準化問題

簡述

  在我上一篇完結的Tianic測試中,我曾提到了一個在使用sklenlearn包中出現的一個問題,這成為了我們這裡預留的一個懸念,也就是為了防止不擬合時而使用了scaling,但是當時我在scaling的時候報錯了,這一下就十分尷尬了,因此我在網上查找了一些相關的資料,最終我找出了問題的所在。當然沒讀過上一篇的童鞋也不需要擔心,這一篇文章的內容我將結合查詢到的資料,簡要的介紹一下梯度下降過程中的歸一化問題,其中涉及到相關特徵的縮放(scaling),同時,我也會在下一節介紹sklenlearn包中的相關操作。

歸一化和標準化

  歸一化這個問題,在我前面的多元線性迴歸演算法的優化中曾有提到過這個問題,但是當時因為懶沒有做相關的詳細介紹,同時,當時我們並不是這樣說的,當時我們是稱該演算法為縮放。但是這裡其實是有一些問題的,我們來先看一下官方的概念,來加深一下了解。
  歸一化方法:歸一化方法有兩種形式,一種是把數變為(0,1)之間的小數,一種是把有量綱表示式變為無量綱表示式。


  我們在檢視後發現這裡並沒有提到縮放這個問題。但是當我查詢一些資料後發現一個問題就是,每當我們提及到歸一化問題時,總會見到另外一個概念就是資料標準化 那麼我們就來在看一下資料標準化的這個概念
  資料的標準化是將資料按比例縮放,使之落入一個小的特定區間。由於信用指標體系的各個指標度量單位是不同的,為了能夠將指標參與評價計算,需要對指標進行規範化處理,通過函式變換將其數值對映到某個數值區間。
  看到這裡我們可能會有點迷糊,那意思縮放屬於資料標準化而並非資料歸一化了麼?其實不然,如果仔細閱讀,我們會發現資料按比例縮放,童鞋們你們不覺得就是把數字變為為(0,1)之間的小數很相似麼。所以,其實歸一化的方法是標準化的手段之一。
  到這裡,童鞋們是不是還是覺得有些糊塗,如果這裡還不清楚我舉一個簡單的例子。在NG教授的machinelearning如果仔細看的童鞋們會發現,NG教授在房價問題(在我前面幾篇的相關部落格中有提到)時,曾提到過特徵縮放,這裡我們看到的很明顯就是資料標準化的問題,但是教授的特徵縮放是把數變為了(0,1)之間的小數,這下我們就應該很清楚這兩者之間的關係了。

為何採取歸一化

  在我們面對多維特徵問題的時候,我們要保證這些特徵都具有相近的尺度,這樣我們能夠幫助梯度下降演算法更快地收斂,但是,大多數的情況下我們會發現資料有時候會出現很大的差異,就比如說在Tiannic中我們擬合預測出缺失的年齡,有幾歲的小盆友,同樣的還有七八十的老大(tu)爺(hao)。可能有人會覺得這其實差的不大,但是我們要知道,在我們進行資料擬合時這小小的問題會對我們最終的判斷造成極大的傷害。另一個例子就很好地說明了這一問題,就是我們在說明標準化和歸一化問題時提到的房價預測問題。假設我們使用兩個特徵,房屋的尺寸和房屋的數量,尺寸的值為0-2000平方英尺,而房間數量的值是0-5,以兩個引數為橫縱座標,繪製代價函式的等高線圖。如左圖
  這裡寫圖片描述


  我們會發現梯度下降演算法需要進行多次迭代才能收斂,而解決的方法就是特徵縮放,將所有特徵的尺度都縮放到(0,1)之間。(如右圖)我們能夠明顯看出,迭代的次數明顯下降,很快地就收斂了。
  歸一化的另一好處是提高精度,這在涉及到一些距離計算的演算法時效果顯著,比如演算法要計算歐氏距離,上圖中x2的取值範圍比較小,涉及到距離計算時其對結果的影響遠比x1帶來的小,所以這就會造成精度的損失。所以歸一化很有必要,他可以讓各個特徵對結果做出的貢獻相同。在多指標評價體系中,由於各評價指標的性質不同,通常具有不同的量綱和數量級。當各指標間的水平相差很大時,如果直接用原始指標值進行分析,就會突出數值較高的指標在綜合分析中的作用,相對削弱數值水平較低指標的作用。因此,為了保證結果的可靠性,需要對原始指標進行相關的操作。

資料歸一化方法

  這裡我們簡單介紹兩種歸一化的方法,當然方法還有很多我們就不一一介紹了。
1.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_mean表示資料的均值。
def Normalization2(x):
return [(float(i)-np.mean(x))/(max(x)-min(x)) for i in x]
這種方法有一個缺陷就是當有新資料加入時,可能導致max和min的變化,需要重新定義。
2.log函式轉換
通過以10為底的log函式轉換的方法同樣可以實現歸一下,具體方法如下:
這裡寫圖片描述
看了下網上很多介紹都是x*=log10(x),其實是有問題的,這個結果並非一定落到[0,1]區間上,應該還要除以log10(max),max為樣本資料最大值,並且所有的資料都要大於等於1。

總結

  這裡我們大概總結了歸一化、標準化相關概念及一些區別還有一些相關的實現。如果有問題的童鞋可以在下面留言,Scikit-learn中的實現我會在下一篇部落格中詳細介紹。同時如果別中有問題 請看到的大佬們多多指教,謝謝。