python使用KNN算法手写体识别
本文实例为大家分享了用KNN算法手写体识别的具体代码,供大家参考,具体内容如下
#!/usr/bin/python #coding:utf-8 importnumpyasnp importoperator importmatplotlib importmatplotlib.pyplotasplt importos ''''' KNN算法 1.计算已知类别数据集中的每个点依次执行与当前点的距离。 2.按照距离递增排序。 3.选取与当前点距离最小的k个点 4.确定前k个点所在类别的出现频率 5.返回前k个点出现频率最高的类别作为当前点的预测分类 ''' ''''' inX为要分类的向量 dataSet为训练样本 labels为标签向量 k为最近邻的个数 ''' defclassify0(inX,dataSet,labels,k): dataSetSize=dataSet.shape[0]#dataSetSize为训练样本的个数 diffMat=np.tile(inX,(dataSetSize,1))-dataSet#将inX扩展为dataSetSize行,1列 sqDiffMat=diffMat**2 sqDistances=sqDiffMat.sum(axis=1) distances=sqDistances**0.5 sortedDistIndicies=distances.argsort()#返回的是元素从小到大排序后,该元素原来的索引值的序列 classCount={} foriinrange(k): voteIlabel=labels[sortedDistIndicies[i]]#voteIlabel为类别 classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#如果之前这个voteIlabel是有的,那么就返回字典里这个voteIlabel里的值,如果没有就返回0 sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#key=operator.itemgetter(1)的意思是按照字典里的第一个排序,{A:1,B:2},要按照第1个(AB是第0个),即‘1'‘2'排序。reverse=True是降序排序 printsortedClassCount returnsortedClassCount[0][0] ''''' 将图像转换为1*1024的向量 ''' defimg2vector(filename): returnVect=np.zeros((1,1024)) fr=open(filename) foriinrange(32): line=fr.readline() forjinrange(32): returnVect[0,i*32+j]=int(line[j]) returnreturnVect ''''' 手写体识别系统测试 ''' defhandwritingClassTest(trainFilePath,testFilePath): hwLabels=[] trainingFileList=os.listdir(trainFilePath) m=len(trainingFileList) trainSet=np.zeros((m,1024)) foriinrange(m): filename=trainingFileList[i] classNum=filename.split('.')[0] classNum=int(classNum.split('_')[0]) hwLabels.append(classNum) trainSet[i]=img2vector(os.path.join(trainFilePath,filename)) testFileList=os.listdir(testFilePath) errorCount=0 mTest=len(testFileList) foriinrange(mTest): filename=trainingFileList[i] classNum=filename.split('.')[0] classNum=int(classNum.split('_')[0]) vectorUnderTest=img2vector(os.path.join(trainFilePath,filename)) classifyNum=classify0(vectorUnderTest,trainSet,hwLabels,10) print"theclassifiercamebackwith:%d,therealansweris:%d"%(classifyNum,classNum) if(classifyNum!=classNum):errorCount+=1 print("\nthetotalnumberoferroris:%d"%errorCount) print("\ntheerrorrateis:%f"%(float(errorCount)/mTest)) handwritingClassTest()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。