數(shù)據(jù)歸一化 Feature Scaling
首先我們開(kāi)看一下為什么要進(jìn)行數(shù)據(jù)歸一化。
我們使用前邊說(shuō)道的腫瘤的例子:
| -- | 腫瘤大小( 厘米) | 發(fā)現(xiàn)時(shí)間(天) |
|---|---|---|
| 樣本1 | 1 | 200 |
| 樣本2 | 5 | 100 |
那么這兩個(gè)樣本的距離是多少呢?如果使用歐拉距離的話,就是
在這種情況下,我們發(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ī)。
最值歸一化適用于分布有明顯邊界的情況;缺點(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:特征值
表示特征值均值
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()

# 查看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()

對(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