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()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。