机器学习实战笔记七_Python3

程序清单2-6 手写数字识别系统的测试代码

伪代码

[python]  view plain  copy
  1. def img2vector(filename):#返回1*1024行向量  
  2.     returnVect = zeros((1,1024))  
  3.     fr = open(filename)  
  4.     for i in range(32):  
  5.         #一次只读一行  
  6.         lineStr = fr.readline()  
  7.         for j in range(32):  
  8.             #行复制  
  9.             returnVect[0,32*i+j] = int(lineStr[j])  
  10.     return returnVect  
  11.   
  12. def handwritingClassTest():  
  13.     hwLabels = []  
  14.     # listdir 可以列出trainingDigits文件夹目录中的文件  
  15.     trainingFileList = listdir('trainingDigits')           #load the training set  
  16.     #check the len of trainingFileList  
  17.     m = len(trainingFileList)  
  18.     #每行数据存储一个图像  
  19.     trainingMat = zeros((m,1024))  
  20.     for i in range(m):  
  21.         #get one name of trainingFileList,ex:0_17.txt  
  22.         fileNameStr = trainingFileList[i]  
  23.         #get"0_17";  
  24.         fileStr = fileNameStr.split('.')[0]     #split函数,去除'.',然后将剩余两侧元素分为一行二列的  
  25.                                                 #向量,然后[0]得到第一列,即0_17  
  26.         #get"0"  
  27.         classNumStr = int(fileStr.split('_')[0])  
  28.         hwLabels.append(classNumStr)  
  29.         trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)  
  30.   
  31.     testFileList = listdir('testDigits')        #iterate through the test set  
  32.     errorCount = 0.0  
  33.     mTest = len(testFileList)  
  34.     for i in range(mTest):  
  35.         #以下为对测试数据的相同处理  
  36.         fileNameStr = testFileList[i]  
  37.         fileStr = fileNameStr.split('.')[0]     #take off .txt  
  38.         classNumStr = int(fileStr.split('_')[0])  
  39.         vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)  
  40.         #k近邻算法  
  41.         classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)  
  42.         #算法输出与结果比较  
  43.         print("the classifier came back with: %d, the real answer is\  
  44.                         : %d" % (classifierResult, classNumStr))  
  45.         if (classifierResult != classNumStr): errorCount += 1.0  
  46.     print ("\nthe total number of errors is: %d" % errorCount)  
  47.     print"\nthe total error rate is: %f" % (errorCount/float(mTest)))  

完整代码

[python]  view plain  copy
  1. #批量注释、批量取消注释 Ctrl+/  
  2. # from __future__ import print_function  
  3. from  numpy import *  
  4. from os import listdir  
  5. import operator#运算符模块  
  6. import matplotlib.pyplot as plt  
  7. def createDataSet():  
  8.     group = array([[1.0,1.1],[1.0,1.0],[0,0],[00.1]])  
  9.     labels = ['A','A','B','B']  
  10.     return group,labels  
  11.   
  12. group,labels=createDataSet()  
  13.   
  14. def classify0(inX, dataSet, labels, k): #inX: 待测试数据 ;  dataSet: 训练样本集;labels: 样本集的标签;k近邻  
  15.     dataSetSize = dataSet.shape[0]      #to get the rows of the matrix  
  16.     # to get the Xi-Yi of the dataSet  
  17.     diffMat = tile(inX, (dataSetSize,1)) - dataSet      #a=[1 2],b=[2 3];tile(a,b) to generate 2*3 matrix when  
  18.                                                         #the element all is a [1 2]  
  19.     sqDiffMat = diffMat**2  
  20.     sqDistances = sqDiffMat.sum(axis=1)         #使每行的元素相加,得到测试样本与各训练样本distance**2  
  21.                                                 #axis=0,按列相加;axis=1,按行相加;  
  22.     distances = sqDistances**0.5  
  23.     sortedDistIndicies = distances.argsort()    #将distance中的元素从小到大排列,  
  24.                                                 # 提取其对应的index(索引),然后输出到 sortedDistIndicies  
  25.    #声明一个dict:{key:value1,key2:value2}  
  26.     classCount={}  
  27.     for i in range(k):  
  28.         voteIlabel = labels[sortedDistIndicies[i]]  
  29.         #classCount= {'B': 2, 'A': 1},初始化后,classCount每得到一个相同的voteIlabel,就+1  
  30.         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1       #当我们获取字典里的值的时候,一个是通过  
  31.                                                                         # 键值对,即dict['key'],另一个就是dict.get()方法  
  32.                                                                         # dict.get(voteIlabel,0) = 0, 此处0 to be initiated,  
  33.                                                                         #  之后就没有作用了。  
  34.     #items方法是可以将字典中的所有项,以列表方式返回。 iteritems方法与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器  
  35.     #Python3 中没有iteritems函数,需要用values()代替,并用list转为列表  
  36.     # sortedClassCount = sorted((key_label, value_num), key=operator.itemgetter(1), reverse=True)  
  37.     #python3中无法使用iteritems,需要对上面这句话改造,我们通过得到两个list,得到出现频率最高的label  
  38.     key_label=list(classCount.keys())  
  39.     value_num=list(classCount.values())  
  40.     #label出现频率由小到大排列,并返回索引index  
  41.     sortedvalue_num_indicies = argsort(value_num)  
  42.     #返回频率最大的label  
  43.     return key_label[len(sortedvalue_num_indicies)-1]  
  44.   
  45. # group,labels = createDataSet()  
  46. # a=classify0([0,0], group,labels,3)  
  47. # print(a)  
  48.   
  49. #自己根据Python3 改正后的函数  
  50. # def file2matrix(filename): # 将数据分离为样本数据与标签  
  51. #     #open a file, default: 'r'ead  
  52. #     fr = open(filename)  
  53. #     #一次读取所有行  
  54. #     arrayOLines = fr.readlines()  
  55. #     #得到行数  
  56. #     numberOfLines = len(arrayOLines)  
  57. #     #1000*3 zeros matrix,row-1000, column-3  
  58. #     returnMat = zeros((numberOfLines,3))  
  59. #     #声明  
  60. #     classLabelVector = []  
  61. #     classLabelVector_Value = []  
  62. #     index = 0  
  63. #     #逐行扫描  
  64. #     for line in arrayOLines:  
  65. #         #strip函数会删除头和尾的字符,中间的不会删除  
  66. #         line = line.strip()  
  67. #         #删除‘\t’字符,仅剩下数据,供使用  
  68. #         listFromLine = line.split('\t')  
  69. #         #得到前三列数据,即飞行时间,游戏,冰激凌  
  70. #         returnMat[index, :] = listFromLine[0:3]  
  71. #         #得到largeDoses,smallDoses,didntLike的label  
  72. #         classLabelVector.append(listFromLine[-1])      #无法将largeDoses,smallDoses,didntLike  
  73. #                                                        #转换为int。基于这个思想,我们在这里将得到的行矩阵建立  
  74. #                                                        #一个数值矩阵与之对应,暂时这样处理,不合适再继续修改  
  75. #         if classLabelVector[index] == 'largeDoses':  
  76. #             classLabelVector_Value.append(3)  
  77. #         elif classLabelVector[index] == 'smallDoses':  
  78. #             classLabelVector_Value.append(2)  
  79. #         else:  
  80. #             classLabelVector_Value.append(1)  
  81. #         index += 1  
  82. #     return returnMat, classLabelVector_Value  
  83. def file2matrix(filename):  
  84.     fr = open(filename)  
  85.     numberOfLines = len(fr.readlines())         #get the number of lines in the file  
  86.     returnMat = zeros((numberOfLines,3))        #prepare matrix to return  
  87.     classLabelVector = []                       #prepare labels return  
  88.     fr = open(filename)  
  89.     index = 0  
  90.     for line in fr.readlines():  
  91.         line = line.strip()  
  92.         listFromLine = line.split('\t')  
  93.         returnMat[index,:] = listFromLine[0:3]  
  94.         classLabelVector.append(int(listFromLine[-1]))  
  95.         index += 1  
  96.     return returnMat,classLabelVector  
  97. def autoNorm(dataSet):#得到归一化后的数据样本,最大值最小值之差,与最小值  
  98.     #得到每一列的max,min  
  99.     minVals = dataSet.min(0)  
  100.     maxVals = dataSet.max(0)  
  101.     ranges = maxVals - minVals  
  102.     #initiate a zero-matrix like dataSet's shape  
  103.     normDataSet = zeros(shape(dataSet))  
  104.     #get the num of row in dataSet  
  105.     m = dataSet.shape[0]  
  106.     #init a matrix of minvals that the same rows to the dataSet, 从而使当前数据矩阵中的每个数减去最小值  
  107.     normDataSet = dataSet - tile(minVals, (m,1))        #tile(matrixlike,A) :init a matrix when the shape is same to A  
  108.                                                         #meanwhile, if A is a number, the matrix is A*1, if A is (m,n),the matrix  
  109.                                                         #is m*n matrix  
  110.     normDataSet = normDataSet/tile(ranges, (m,1))      #element wise divide  
  111.     return normDataSet, ranges, minVals  
  112.   
  113.   
  114. def datingClassTest():  
  115.     #使用10%的数据去测试分类器  
  116.     hoRatio = 0.10  # hold out 10%  
  117.     #datingTestSet2.txt中标签全部变为3,2,1,而不是字符串label,所以如果不想改file2matrix()函数,应用datingTestSet.txt  
  118.     #如果file2matrix()用书中原程序,可用datingTestSet.txt  
  119.     datingDataMat, datingLabels = file2matrix('datingTestSet.txt')  # 将数据分离为样本数据与标签  
  120.     normMat, ranges, minVals = autoNorm(datingDataMat)#得到归一化后的数据样本,最大值最小值之差,与最小值  
  121.     #get the num of the row  
  122.     m = normMat.shape[0]  
  123.     #get the test num of normMat  
  124.     numTestVecs = int(m * hoRatio)  
  125.     errorCount = 0.0  
  126.     for i in range(numTestVecs):  
  127.         #数据前numTestVecs个为测试数据,以后为样本训练集  
  128.         classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)  # inX: 待测试数据 ;  dataSet: 训练样本集;labels: 样本集的标签;k近邻  
  129.         #测试结果与真正结果对照输出  
  130.         print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))  
  131.         if classifierResult != datingLabels[i]:  
  132.             errorCount += 1.0  
  133.     print("the total error rate is: %f"% (errorCount / float(numTestVecs)))  
  134.     print(errorCount)  
  135.   
  136. def img2vector(filename):#返回1*1024行向量  
  137.     returnVect = zeros((1,1024))  
  138.     fr = open(filename)  
  139.     for i in range(32):  
  140.         #一次只读一行  
  141.         lineStr = fr.readline()  
  142.         for j in range(32):  
  143.             #行复制  
  144.             returnVect[0,32*i+j] = int(lineStr[j])  
  145.     return returnVect  
  146.   
  147. def handwritingClassTest():  
  148.     hwLabels = []  
  149.     # listdir 可以列出trainingDigits文件夹目录中的文件  
  150.     trainingFileList = listdir('trainingDigits')           #load the training set  
  151.     #check the len of trainingFileList  
  152.     m = len(trainingFileList)  
  153.     #每行数据存储一个图像  
  154.     trainingMat = zeros((m,1024))  
  155.     for i in range(m):  
  156.         #get one name of trainingFileList,ex:0_17.txt  
  157.         fileNameStr = trainingFileList[i]  
  158.         #get"0_17";  
  159.         fileStr = fileNameStr.split('.')[0]     #split函数,去除'.',然后将剩余两侧元素分为一行二列的  
  160.                                                 #向量,然后[0]得到第一列,即0_17  
  161.         #get"0"  
  162.         classNumStr = int(fileStr.split('_')[0])  
  163.         hwLabels.append(classNumStr)  
  164.         trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)  
  165.   
  166.     testFileList = listdir('testDigits')        #iterate through the test set  
  167.     errorCount = 0.0  
  168.     mTest = len(testFileList)  
  169.     for i in range(mTest):  
  170.         #以下为对测试数据的相同处理  
  171.         fileNameStr = testFileList[i]  
  172.         fileStr = fileNameStr.split('.')[0]     #take off .txt  
  173.         classNumStr = int(fileStr.split('_')[0])  
  174.         vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)  
  175.         #k近邻算法  
  176.         classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)  
  177.         #算法输出与结果比较  
  178.         print("the classifier came back with: %d, the real answer is\  
  179.                         : %d" % (classifierResult, classNumStr))  
  180.         if (classifierResult != classNumStr): errorCount += 1.0  
  181.     print ("\nthe total number of errors is: %d" % errorCount)  
  182.     print"\nthe total error rate is: %f" % (errorCount/float(mTest)))  

测试

[python]  view plain  copy
  1. handwritingClassTest()  

完成!


##########################################

转自:https://blog.csdn.net/shunquanlan9446/article/details/79779403

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值