$newValue = http://www.netofthings.cn/JieJueFangAn/2017-01/(oldValue - min)/(max - min)$
其中,min和max分別為特征值中最大和最小值,雖然改變數(shù)值范圍增加了分類器的復(fù)雜度,但是為了得到準(zhǔn)確的結(jié)果,必須這樣做,所以我們?cè)趉NN.py中新增一個(gè)函數(shù)autoNorm()
,用來(lái)將數(shù)字特征值轉(zhuǎn)化為0-1的區(qū)間:
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
運(yùn)行結(jié)果:
>>> import kNN>>> mat, vec = kNN.file2matrix('datingTestSet2.txt')>>> a, b, c = kNN.autoNorm(mat)>>> aarray([[ 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]])
這樣一來(lái),我們把值處理成了我們預(yù)期的范偉內(nèi)的值。
- 測(cè)試算法
通常我們把數(shù)據(jù)集的90%的數(shù)據(jù)當(dāng)做訓(xùn)練集,余下的10%作為測(cè)試集,著10%的數(shù)據(jù)是隨機(jī)選擇的。 下面,我們來(lái)書(shū)寫(xiě)測(cè)試程序,并通過(guò)datingTestSet.txt
來(lái)測(cè)試程序:
def datingClassTest() : hoRatio = 0.10 # 設(shè)置抽取多少數(shù)據(jù)進(jìn)行測(cè)試集 datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') # 讀入數(shù)據(jù)集 normMat, ranges, minVals = autoNorm(datingDataMat) # 轉(zhuǎn)化特征值至 0 - 1 區(qū)間內(nèi) m = normMat.shape[0] numTestVecs = int( m * hoRatio ) # 計(jì)算測(cè)試向量的數(shù)量 errorCount = 0.0 for i in range(numTestVecs) : classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs: m], 3) # 使用近鄰算法得出結(jié)果 print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i])