第二章 K-近邻算法 及 手写识别系统

来源:互联网 发布:淘宝ipad为什么便宜 编辑:程序博客网 时间:2024/05/18 02:34

这一节主要是手写识别数字系统的搭建。实际训练数据在 trainingDigits 里面,大约2000个例子。

为了使用之前 2.2 的分类器,要把图像格式化处理为一个向量,32*32 变成 1* 1024。

首先写一个 img2vector 函数,打开给定文件,循环读出前32行,然后把每行的头32个字符存在 NumPy 数组里面,最后返回数组。

这个片段加在之前 kNN.py 里面。

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

然后写测试代码:

def handwritingClassTest():    hwLabels = []    trainingFileList = listdir('trainingDigits') # 路径写好    m = len(trainingFileList)    trainingMat = zeros((m,1024))    for i in range(m):        fileNameStr = trainingFileList[i]        fileStr = fileNameStr.split('.')[0] # 0 指的是取第一个值,这里是获取文件名        classNumStr = int(fileStr.split('_')[0]) # 获取文件真实数字,比如 6_10.txt,这里得到的是6        hwLabels.append(classNumStr)        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr) # 从头到尾    testFileList = listdir('testDigits')    errorCount = 0.0    mTest = 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 came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)        if (classifierResult != classNumStr):errorCount += 1.0        print "\nthe total number of error is: %d" % errorCount        print "\nthe total error rate is: %f" % (errorCount/float(mTest))

新建一个 usekNN.py 文件如下:

import kNN#just test reading.testVector = kNN.img2vector('testDigits/0_13.txt')print testVector[0,0:31]print '*****************************'print testVector[0,32:63]print '*****************************'kNN.handwritingClassTest()

最后运行即可,错误率为 1.1628%


======================================================================================

实际上运行效率不高的,下一节要讲述的就是 k决策树 算法。


另外Python 可以计时,用 time() 函数实现,第一次调用开始计时,第二次调用停止计时:

# -*- coding:utf-8 -*-import kNNimport time#just test reading.testVector = kNN.img2vector('testDigits/0_13.txt')print testVector[0,0:31]print '*****************************'print testVector[0,32:63]print '*****************************'t0 = time.clock() # 第一次计时kNN.handwritingClassTest()t1 = time.clock()print "Cost you %f second." % (t1 - t0) # 结束计时



0 0
原创粉丝点击