1. 程式人生 > >機器學習實戰之k-近鄰演算法(4)--- 如何歸一化資料

機器學習實戰之k-近鄰演算法(4)--- 如何歸一化資料

歸一化的公式:

newValue = (oldValue - min) / (max - min)

就是把資料歸一化到[0, 1]區間上。

好處:

防止某一維度的資料的數值大小對距離就算產生影響。多個維度的特徵是等權重的,所以不能被數值大小影響。

下面是歸一化特徵值的程式碼:

#歸一化特徵值
def autoNorm(dataSet):
    minVals = dataSet.min(0)
    maxVals = dataSet.max(0)
    ranges = maxVals - minVals
    normDataSet = zeros(shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - tile(minVals, (m, 1))
    normDataSet = normDataSet / tile(ranges, (m, 1))
    return normDataSet, ranges, minVals

然後在Python shell中:

>>> reload(kNN)
<module 'kNN' from 'kNN.py'>
>>> normMat, ranges, minVals = kNN.autoNorm(datingDataMat)
>>> normMat
array([[ 0.44832535,  0.39805139,  0.56233353],
       [ 0.15873259,  0.34195467,  0.98724416],
       [ 0.28542943,  0.06892523,  0.47449629],
       ..., 
       [ 0.29115949,  0.50910294,  0.51079493],
       [ 0.52711097,  0.43665451,  0.4290048 ],
       [ 0.47940793,  0.3768091 ,  0.78571804]])
>>> ranges
array([  9.12730000e+04,   2.09193490e+01,   1.69436100e+00])
>>> minVals
array([ 0.      ,  0.      ,  0.001156])

其中datingDataMat是呼叫前面的函式得到的:

>>> import kNN
>>> reload(kNN)
<module 'kNN' from 'kNN.pyc'>
>>> datingDataMat, datingLabels = kNN.file2matrix('datingTestSet2.txt', 3)

下面解釋一下歸一化的函式:


(1)tile函式是把第一個引數複製成一個m*1的矩陣中去。

(2)這裡的 / 是每個元素相除,如果是矩陣的除法,需要用到linalg.solve(matA, matB)