当前位置: 代码迷 >> 综合 >> 机器学习实战 手写识别系统
  详细解决方案

机器学习实战 手写识别系统

热度:27   发布时间:2024-02-27 03:29:35.0

构造使用k-近邻分类器的手写识别系统

step1.准备数据:将图像转换为测试向量

把32*32的二进制图像矩阵转换成1*1024的向量,这样就可以之前的分类器来处理了

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

#代码解释

fileObject.readline(size)
size -- 从文件中读取的字节数。

zeros(shape, dtype=float, order='C')

返回一个给定形状和类型的用0填充的数组;

shape:形状

dtype:数据类型

order:可选参数,c代表与c语言类似,行优先;F代表列优先

step2.测试算法:使用k-近邻算法识别手写数字

算法作用:

把训练集的每个图片改成一行的数组  m个图片形成m*1024的数组

把图片的文件名拆开  记录该图片代表的数字

对测试集进行同样的操作  将测试集每个图片的结果和真实数字比较  记录测试集中一共有多少个不同的(也就是判断错误的)

计算出错误率  错误率=测试集中判断错误的 / 测试集总数目

def handwritingClassTest():hwLabels = []# load the training set# trainingFileList是各个文件# m是文件个数# trainingMat是各个文件变成一行之后的整合矩阵#fileNameStr单个文件名trainingFileList = listdir('trainingDigits')          m = len(trainingFileList)trainingMat = zeros((m,1024))for i in range(m):fileNameStr = trainingFileList[i]# take off .txt#按.分开 fileStr取分开后的第一个元素 classNumStr记录这个数字是什么fileStr = fileNameStr.split('.')[0]classNumStr = int(fileStr.split('_')[0])hwLabels.append(classNumStr)#通过img2vector把图片变成一行的 并放入trainingMat对应行trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)# iterate through the test settestFileList = listdir('testDigits')        errorCount = 0.0mTest = len(testFileList)for i in range(mTest):fileNameStr = testFileList[i]fileStr = fileNameStr.split('.')[0]     #take off .txtclassNumStr = int(fileStr.split('_')[0])vectorUnderTest = img2vector('testDigits/%s' % fileNameStr)classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)print ("the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr))#当测试结果和训练结果不同时 错误+1if (classifierResult != classNumStr): errorCount += 1.0print ("\nthe total number of errors is: %d" % errorCount)print ("\nthe total error rate is: %f" % (errorCount/float(mTest)))

#代码解释

os.listdir(path)
返回指定路径path下的文件和文件夹列表

str.split(str="", num=string.count(str)).
split( ) 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串,返回分割后的字符串列表。 

str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。

num -- 分割次数。默认为 -1, 即分隔所有。

 

 

 

 

 

  相关解决方案