4.7 數(shù)據(jù)歸一化

數(shù)據(jù)歸一化 Feature Scaling

首先我們開(kāi)看一下為什么要進(jìn)行數(shù)據(jù)歸一化。
我們使用前邊說(shuō)道的腫瘤的例子:

-- 腫瘤大小( 厘米) 發(fā)現(xiàn)時(shí)間(天)
樣本1 1 200
樣本2 5 100

那么這兩個(gè)樣本的距離是多少呢?如果使用歐拉距離的話,就是
\sqrt{(1-5)^2 + (100-200)^2}
在這種情況下,我們發(fā)現(xiàn)顯然樣本間的距離被發(fā)現(xiàn)時(shí)間所主導(dǎo),因?yàn)闀r(shí)間間隔比較大,導(dǎo)致最終距離衡量的是時(shí)間。如果我們發(fā)現(xiàn)時(shí)間調(diào)整成以年為單位,此時(shí)腫瘤的距離有一下子又取決于腫瘤大小這個(gè)特征。很顯然,如果不進(jìn)行數(shù)據(jù)的基本處理,直接計(jì)算樣本間的距離是有很大偏差的,不能反映每個(gè)樣本特征的重要程度,所以要進(jìn)行數(shù)據(jù)歸一化處理。

-- 腫瘤大小( 厘米) 發(fā)現(xiàn)時(shí)間(天)
樣本1 1 200=0.55年
樣本2 5 100=0.27年

數(shù)據(jù)歸一化,所謂的數(shù)據(jù)歸一化處理就是將所有的數(shù)據(jù)映射到同一尺度。通常最簡(jiǎn)單的方式叫作最值歸一化(normalization): 把所有的數(shù)據(jù)映射到0-1之間。適用于有明確的邊界,如學(xué)生的成績(jī)。
x_{scale}=\frac{x-x_{min}}{x_{max}-x_{min}}
最值歸一化適用于分布有明顯邊界的情況;缺點(diǎn):受outliner影響較大,例如每個(gè)人的收入,沒(méi)有明顯的邊界,假如大部分人的收入是1萬(wàn),有一個(gè)人收入是100萬(wàn),那么大部分人的映射在0-0.01左右,而收入高的人映射值接近1,因?yàn)檫@樣偏差比較大,改進(jìn)的方法是均值方差歸一化(standardization)
均值方差歸一化:把所有數(shù)據(jù)歸一到均值為0方差為1的分布中。適用于數(shù)據(jù)分布沒(méi)有明顯的邊界;有可能存在極端數(shù)據(jù)值的情況。計(jì)算方法:
x_{scale} =\frac{x-x_{mean}}{S}
x:特征值
x_{mean}表示特征值均值
S:表示方差
下面我們來(lái)實(shí)現(xiàn)這兩種歸一化過(guò)程

import numpy as np
import matplotlib.pyplot as plt
# 最值歸一化 Normalization
# 處理向量
x = np.random.randint(0, 100, size=100)
(x - np.min(x)) / (np.max(x)-np.min(x))
array([0.12121212, 0.24242424, 0.43434343, 0.49494949, 0.91919192,
       0.54545455, 0.16161616, 0.53535354, 0.8989899 , 0.11111111,
       0.49494949, 0.33333333, 0.72727273, 0.85858586, 0.27272727,
       0.4040404 , 0.53535354, 0.56565657, 0.63636364, 0.58585859,
       0.74747475, 0.8989899 , 0.54545455, 0.85858586, 0.25252525,
       0.55555556, 0.77777778, 0.39393939, 0.43434343, 0.37373737,
       0.4040404 , 0.15151515, 0.29292929, 0.31313131, 0.6969697 ,
       0.93939394, 0.61616162, 0.78787879, 0.3030303 , 0.26262626,
       0.17171717, 0.05050505, 0.56565657, 0.52525253, 0.13131313,
       0.63636364, 0.7979798 , 0.4040404 , 0.49494949, 1.        ,
       0.52525253, 0.51515152, 0.85858586, 0.49494949, 0.25252525,
       0.36363636, 0.        , 0.51515152, 0.87878788, 0.42424242,
       0.5959596 , 0.44444444, 0.1010101 , 0.03030303, 0.33333333,
       0.07070707, 0.7979798 , 0.35353535, 0.34343434, 0.11111111,
       0.45454545, 0.95959596, 0.83838384, 0.4040404 , 0.45454545,
       0.45454545, 0.31313131, 0.39393939, 0.58585859, 0.02020202,
       0.19191919, 0.60606061, 0.05050505, 0.25252525, 0.61616162,
       0.73737374, 0.52525253, 0.6969697 , 0.35353535, 0.95959596,
       0.98989899, 0.3030303 , 0.47474747, 0.85858586, 0.        ,
       0.12121212, 0.74747475, 0.18181818, 0.92929293, 0.3030303 ])
# 處理矩陣
X = np.random.randint(0, 100, (50, 2))
# 由于最值歸一化得到的是浮點(diǎn)數(shù),所以進(jìn)行一下類型轉(zhuǎn)換
X = np.array(X, dtype=float)
# 查看是否吧變成浮點(diǎn)數(shù)
X[:10]
array([[85., 65.],
       [17., 55.],
       [16., 67.],
       [45., 77.],
       [90., 71.],
       [31., 89.],
       [42., 92.],
       [53., 56.],
       [80., 25.],
       [75., 45.]])
# 對(duì)第0列數(shù)據(jù),就是這謝數(shù)據(jù)的第一個(gè)特征值,進(jìn)行最值歸一化
X[:, 0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
# 對(duì)第1列數(shù)據(jù),就是這謝數(shù)據(jù)的第二個(gè)特征值,進(jìn)行最值歸一化
X[:, 1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))
# 我們?nèi)〕銮笆锌匆幌聦?duì)應(yīng)的數(shù)據(jù)結(jié)果
X[:10,:]
array([[0.89361702, 0.64948454],
       [0.17021277, 0.54639175],
       [0.15957447, 0.67010309],
       [0.46808511, 0.77319588],
       [0.94680851, 0.71134021],
       [0.31914894, 0.89690722],
       [0.43617021, 0.92783505],
       [0.55319149, 0.55670103],
       [0.84042553, 0.2371134 ],
       [0.78723404, 0.44329897]])
# 簡(jiǎn)單的繪制我們的樣本
plt.scatter(X[:,0],X[:,1])
plt.show()
image
# 查看X中第0列對(duì)應(yīng)的均值
np.mean(X[:,0])
0.5546808510638298
# 查看X中第0列對(duì)應(yīng)的方差
np.std(X[:,0])
0.28191296667346266
# 查看X中第1列對(duì)應(yīng)的均值
np.mean(X[:,1])
0.49711340206185567
# 查看X中第1列對(duì)應(yīng)的方差
np.std(X[:,1])
0.2898010576098996

下面我們來(lái)看均值方差歸一化

X2 = np.random.randint(0, 100, (50, 2))
X2 = np.array(X, dtype=float)
X2[:,0] = (X2[:,0] - np.mean(X2[:,0])) / np.std(X2[:,0])
X2[:,1] = (X2[:,1] - np.mean(X2[:,1])) / np.std(X2[:,1])
# 簡(jiǎn)單的繪制我們的樣本
plt.scatter(X2[:,0],X2[:,1])
plt.show()
image

對(duì)于這組數(shù)據(jù),我們不能確定得到的結(jié)果是在0-1之間的,下面我們來(lái)看一下均值和方差

np.mean(X2[:,0])
-2.2204460492503132e-17
np.std(X2[:,0])
1.0
np.mean(X2[:,1])
4.440892098500626e-18
np.std(X2[:,1])
0.9999999999999999
由此可見(jiàn),我們可以看出均值接近于0,方差接近1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容