接着上一个例子进行拓展,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%,还不错