KNN演算法的資料歸一化--Feature Scaling

我是馬克思小清新發表於2018-10-30

如圖1所示,假設現在有兩個樣本,分別擁有兩個特徵,如下:

  腫瘤的大小(釐米)的 發現時間(天)
樣本1 1 200
樣本2 100

計算兩個樣本之間的尤拉距離:

D =  \ SQRT {(1-5)^ 2 +(200-100)^ 2},這個計算結果很明顯是被時間主導的。

所以,將時間以年為單位,那麼兩個樣本之間的尤拉距離就是:

D =  \ SQRT {(1-5)^ 2 +(0.55-0.27)^ 2},這個計算結果又很明顯的是被腫瘤大小主導的。

根據這個問題,我們提出了數值歸一化:將所有的資料對映到同一個尺度。

 

2,資料歸一化的方式有兩種:

       最值歸一化(歸一化),將所有的資料對映到0-1之間。它是最簡單的資料歸一化。求出每個特徵的最大值和最小值,先將資料對映到O-(的的Xmax-Xmin時時)中,再求特徵點X在該範圍長度中所佔的比例。

                                                                    Xscale = \ frac {X-Xmin} {Xmax -Xmin}

這種方式適用於有明顯邊界的情況,因為受異常值的影響比較大。

比如有一組特徵表示學生的成績分數,分數是有明顯邊界的,最低0分,最高100分。在影像中,每個畫素點的畫素值也是有明顯邊界的,範圍是-255。這些都適合用最值歸一化處理資料的。像工資的話,就不適用,工資高的歸一化接近1,工資低的歸一化接近0,屬於極端資料了。

       均值方差歸一化(標準化):把所有的資料歸一到均值是0,方差是1的分佈中。

                                                       Xscale = \ frac {X  -  Xmean} {S}

這個方式適用於資料分佈沒有明顯的邊界,有可能存在極端資料值。

 

 

3,簡單的程式碼介紹。

其一,最值歸一化,隨機生成一個有100個數的矩​​陣,資料的範圍是0-100。根據公式將資料歸一化。

X = np.random.randint(0,100,size = 100)
array = (x - np.min(x))/(np.max(x) - np.min(x))

對矩陣進行歸一化。定義一個50 * 2的矩陣,每個數字的範圍是0-100,由於歸一化的資料是浮點型,所以要先將矩陣轉換成浮點型。最後根據公式,對每一列的資料進行歸一化。

X = np.random.randint(0,100,(50,2))
X = np.array(X,dtype = float)
X[:,0] = (X[:,0] - np.min(X[:,0]))/(np.max(X[:,0]) - np.min(X[:,0]))
X[:,1] = (X[:,1] - np.min(X[:,1]))/(np.max(X[:,1]) - np.min(X[:,1]))

其二,均值方差歸一化,根據公式,對每一列的資料進行歸一化。

X = np.random.randint(0,100,(50,2))
X = np.array(X,dtype = float)
X[:,0] =(X[:,0] - np.mean(X[:,0])) / np.std(X[:,0])
X[:,1] =(X[:,0] - np.mean(X[:,0])) / np.std(X[:,0])

 

相關文章