第二章 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) # 結束計時



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