K-近鄰演算法的一個簡單例子(二)
阿新 • • 發佈:2019-01-02
接著上一個例子進行拓展,file2matrix()函式將文件中的資料轉化為記憶體中的矩陣(陣列),autoNorm()將三列資料歸一化,這裡要注意這裡使用的歸一化方法對於極值點非常敏感,可以考慮其他的方法。datingClassTest()呼叫KNN中的classify0函式對資料集進行逐個進行 分類,這裡K取3.hoRatio=0.10劃定了訓練集和檢驗集,但要想實現更好的效果,對於劃定訓練集和檢驗集需要十分慎重,使用隨機抽取等方法 from numpy import * import matplotlib.pyplot as pyt import KNN def file2matrix(filename): fr=open(filename) arrayOLines=fr.readlines() #注意和read()、readline()的區別 numberOfLines=len(arrayOLines) returnMat=zeros((numberOfLines,3)) classLabelVector=[] index=0 for line in arrayOLines: line=line.strip() listFromLine=line.split('\t') returnMat[index,:]=listFromLine[0:3] #這裡 returnMat[index,:],意思是指index行進行[:] classLabelVector.append(listFromLine[-1]) index+=1 return returnMat,classLabelVector def autoNorm(dataSet): minVals=dataSet.min(0) #numpy中min()沒有引數時,返回所有中最小的,0每列最小,1每行最小 maxVals=dataSet.max(0) ranges=maxVals-minVals normDataset=zeros(shape(dataSet)) m=dataSet.shape[0] #dataSet的行數 normDataset=dataSet-tile(minVals,(m,1)) # jk=tile(range,(m,1)) normDataset=normDataset/tile(ranges,(m,1)) return normDataset def datingClassTest(): hoRatio=0.10 #測試資料所佔的比例 datingDataMat,datingDataLabel=file2matrix('E:\datingTestSet.txt') normMat=autoNorm(datingDataMat) m=normMat.shape[0] numTestVecs=int(m*hoRatio) erroCount=0.0 for i in range(numTestVecs): classifierResult=KNN.classify0(normMat[i,:],normMat[numTestVecs:m,:],datingDataLabel[numTestVecs:m],3) print('the classifier came back with: %s,the real answer is : %s '%(classifierResult,datingDataLabel[i])) if (classifierResult!=datingDataLabel[i]): erroCount+=1.0 print('the total error rate is : %f'%(erroCount/float(numTestVecs))) datingClassTest()
執行結果:
the classifier came back with: 1,the real answer is : 1
..............此處省略998行
the classifier came back with: 2,the real answer is : 2
the total error rate is : 0.080000
錯誤率8%,還不錯