1. 程式人生 > >K-近鄰演算法的一個簡單例子(二)

K-近鄰演算法的一個簡單例子(二)

接著上一個例子進行拓展,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%,還不錯