機器學習實戰之k-近鄰演算法(4)--- 如何歸一化資料
阿新 • • 發佈:2019-02-19
歸一化的公式:
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)