本文实例为大家分享了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使用资讯算法识别手写数字