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