1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > (机器学习实战)2.3手写识别系统(详细注释)

(机器学习实战)2.3手写识别系统(详细注释)

时间:2023-07-17 19:04:24

相关推荐

(机器学习实战)2.3手写识别系统(详细注释)

编译:python3.6

代码和训练集下载:/s/1m7HdAkuwGgXX8v5-DN118Q

import operator from numpy import *from scipy import *from matplotlib import *"""KNN近邻分类思路:1,用shape[0]得到行数2,把带划分数据用tile扩展成一个矩阵3,(用该矩阵-训练数据)平方后开方得到一个列表4,对列表按距离升序排列5,选取前K个中标签出现次数后按降序排列,[0][0]即为出现最多的标签作为带预测的划分标签"""#inx为自己输入要分类的测试数,dataset为训练集,labels为标签集,k为kNN中的K值#shape[0]得到训练样本多少行#tile建立inx,dataSetSize行,1列#sum(axis=1),按行相加#argsort递增排序def classify0(inX,dataSet,labels,k):dataSetSize=dataSet.shape[0]diffMat=tile(inX,(dataSetSize,1))-dataSetsqDiffMat=diffMat**2sqDistances=sqDiffMat.sum(axis=1) #distances=sqDistances**0.5sortedDistIndicies=distances.argsort() #生成的不是距离而是标号列表 #print(sortedDistIndicies)classCount={}for i in range(k):#print(sortedDistIndicies[i]) voteIlabel=labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #这一步是做相同标签的统计(+1),找到键voteIlabel对应的值,如果不存在这样的键则返回默认值0#print(classCount.get(voteIlabel,0))sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #sorted排序做升序,返回副本,原始输入不变,里面的参数设置请参考/timtike/p/6562402.html,/hshl1214/article/details/40587985#print(sortedClassCount[0][0])#或者参考/zhoufankui/p/6274172.htmlreturn sortedClassCount[0][0]"""将图像转换为测试向量:1、建立1*1024的0矩阵2、用历遍的方法生成矩阵"""def img2vector(filename):returnVect=zeros((1,1024))fr=open(filename)for i in range(32):lineStr=fr.readline()for j in range(32):returnVect[0,32*i+j]=int(lineStr[j])return returnVect"""测试算法思路:1、创建训练特征矩阵2、存储训练特征矩阵和标签3、创建错误累加4、用历遍的方式累加"""from os import listdirdef handwritingClassTest():hwLabels=[]trainingFileList=listdir('trainingDigits')m=len(trainingFileList)trainingMat=zeros((m,1024))for i in range(m):fileNameStr=trainingFileList[i]fileStr=fileNameStr.split('.')[0] #提取文件名classNumStr=int(fileStr.split('_')[0])#提取文件名前面的数字hwLabels.append(classNumStr)trainingMat[i,:]=img2vector('trainingDigits/%s'%fileNameStr) #/代表子文件夹testFileList=listdir('testDigits')errorCount=0.0mTest=len(testFileList)for i in range(mTest):fileNameStr=testFileList[i]fileStr=fileNameStr.split('.')[0] #提取文件名classNumStr=int(fileStr.split('_')[0])#提取文件名前面的数字vectorUnderTest=img2vector('testDigits/%s'%fileNameStr) #/代表子文件夹classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)print("the classifier come back with %d,the real result is %d"%(classifierResult,classNumStr))if(classifierResult!=classNumStr):errorCount+=1print('\n the total numer of errors is %d'%errorCount)print('\n the total error rate is %f'%(errorCount/float(mTest)))#可以选择显示一下#handwritingClassTest()"""字符预测函数思路:1,输入特征值2、建立特征值数组3、归一化特征值4、输入预测文档如:4_0.txt5、返回预测值"""def classifyChrct():hwLabels=[]trainingFileList=listdir('trainingDigits')m=len(trainingFileList)trainingMat=zeros((m,1024))for i in range(m):fileNameStr=trainingFileList[i]fileStr=fileNameStr.split('.')[0] #提取文件名classNumStr=int(fileStr.split('_')[0])#提取文件名前面的数字hwLabels.append(classNumStr)trainingMat[i,:]=img2vector('trainingDigits/%s'%fileNameStr) #/代表子文件夹inputDocument=input('Please input the document with .txt that you want forecast\n')vectorUnderTest=img2vector('testDigits/%s'%(inputDocument))classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)print("the classifier come back with %d"%(classifierResult))#预测看结果classifyChrct()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。