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

这一节主要是手写识别数字系统的搭建。实际训练数据在 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 kNN
import 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) # 结束计时



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章