這一節主要是手寫識別數字系統的搭建。實際訓練數據在 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) # 結束計時