python使用资讯算法识别手写数字

  

本文实例为大家分享了python使用资讯算法识别手写数字的具体代码,供大家参考,具体内容如下

        # - * -编码:utf - 8 - *   # pip安装numpy   进口操作系统   进口os.path   从numpy进口*   进口经营者   导入的时间   从操作系统导入listdir      ”“”   描述:   然而,算法实现分类器   参数:   inputPoint:测试集   数据集:训练集   标签:类别标签   凯西:k个邻居   返回值:   该测试数据的类别   ”“”   def分类(inputPoint、数据集、标签,k):   dataSetSize=数据集。形状[0]#已知分类的数据集(训练集)的行数   #先瓷砖函数将输入点拓展成与训练集相同维数的矩阵,再计算欧氏距离   diffMat=瓷砖(inputPoint (dataSetSize, 1))数据集#样本与训练集的差值矩阵      #打印(inputPoint);   sqDiffMat=diffMat * * 2 # sqDiffMat的数据类型是nump提供的ndarray,这不是矩阵的平方,而是每个元素变成原来的平方。   sqDistances=sqDiffMat.sum(轴=1)#计算每一行上元素的和   #打印(sqDistances);   距离=sqDistances * * 0.5 #开方得到欧拉距离矩阵   #打印(距离);   sortedDistIndicies=distances.argsort() #按距离中元素进行升序排序后得到的对应下标的列表,argsort函数返回的是数组值从小到大的索引值   #打印(sortedDistIndicies);      # classCount数据类型是这样的{0:2,1:2},字典键:值   classCount={}   #选择距离最小的k个点   因为我在范围(k):   voteIlabel=标签[sortedDistIndicies[我]]   #打印(voteIlabel)   #类别数加1   classCount [voteIlabel]=classCount.get (voteIlabel,0) + 1   打印(classCount) # {1: 1, 7: 2}   2 #按classCount字典的第个元素(即类别出现的次数)从大到小排的序   sortedClassCount=排序(classCount.items()、关键=operator.itemgetter(1)反向=True)   打印(sortedClassCount) # ((7, 2), (1,1)]   返回sortedClassCount [0] [0]      ”“”   描述:   读取指定文件名的文本数据,构建一个矩阵   参数:   文本文件名称   返回值:   一个单行矩阵   ”“”   def img2vector(文件名):   returnVect=[]   fr=开放(文件名)   因为我在范围(32):   lineStr=fr.readline ()   j的范围(32):   returnVect.append (int (lineStr [j]))   返回returnVect      ”“”   描述:   从文件名中解析分类数字,比如由0 _0.txt得知这个文本代表的数字分类是0   参数:   文本文件名称   返回值:   一个代表分类的数字   ”“”   def classnumCut(文件名):   fileStr=fileName.split (“。”) [0]   classNumStr=int (fileStr.split (“_”) [0])   返回classNumStr      ”“”   描述:   构建训练集数据向量,及对应分类标签向量   参数:   无   返回值:   hwLabels:分类标签矩阵   trainingMat:训练数据集矩阵   ”“”   def trainingDataSet ():   hwLabels=[]   trainingFileList=listdir (trainingDigits) #获取目录内容   m=len (trainingFileList)   # 0返回全部是0的矩阵,参数是行和列   trainingMat=0 ((m, 1024)) # m维向量的训练集   我的范围(米):   #打印(我);   fileNameStr=trainingFileList[我]   hwLabels.append (classnumCut (fileNameStr))   trainingMat [i:]=img2vector (' trainingDigits/% s ' % fileNameStr)   返回hwLabels trainingMat      ”“”   描述:   主函数,最终打印识别了多少个数字以及识别的错误率   参数:   无   返回值:   无   ”“”   def handwritingTest ():   ”“”   hwLabels, trainingMat是标签和训练数据,   hwLabels是一个一维矩阵,代表每个文本对应的标签(即文本所代表的数字类型)   trainingMat是一个多维矩阵,每一行都代表一个文本的数据,每行有1024个数字(0或1)   ”“”   hwLabels trainingMat=trainingDataSet() #构建训练集   testFileList=listdir (testDigits) #获取测试集   errorCount=0.0 #错误数   太=len (testFileList) #测试集总样本数   t1=time.time ()   因为我在范围(mt):   fileNameStr=testFileList[我]   classNumStr=classnumCut (fileNameStr)   # img2vector返回一个文本对应的一维矩阵,1024个0或1者   vectorUnderTest=img2vector (' testDigits/% s ' % fileNameStr)   #调用资讯算法进行测试   classifierResult=分类(vectorUnderTest trainingMat hwLabels, 3)   #打印测试出来的结果和真正的结果,看看是否匹配   打印(“分类器回来:% d,真正的答案是:% d % (classifierResult classNumStr))   #如果测试出来的值和原值不相等,errorCount + 1   如果(classifierResult !=classNumStr):   errorCount +=1.0   打印(“\ nthe测试的总数是:% d % mt) #输出测试总样本数   打印(“错误的总数是:% d % errorCount) #输出测试错误样本数   打印(“总错误率:% f % (errorCount/浮动(mt))) #输出错误率   t2=time.time ()   打印(“成本时间:%。2 fmin % .4fs”。% (//(t2-t1) 60岁(t2-t1) % 60)) #测试耗时      ”“”   描述:   指定handwritingTest()为主函数   ”“”   if __name__==癬_main__”:   handwritingTest ()

python使用资讯算法识别手写数字