这个是《机器学习实战》的第二个实例,用kNN算法实现手写识别,识别0-9这几个数字;
要实现手写识别功能,
首先将图像数据转换为矩阵或者向量形式,本例使用32*32的二值图像,转化成1*1024的数组,具体代码如下:
def img2vector(filename):
returnVect = zeros((1,1024)) #创建一个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
要插入中文注释,还需要在python脚本文件中的第一行或者第二行添加
#coding:gbk 或
#coding:utf-8 或
##-*- coding : gbk -*-
然后我们将数据输入到分类器中,检查效果
程序中的classify0函数在上一篇文章中有提到
def handwritingClassTest():
hwLabels = [] #创建空数组,存储手写标签
trainingFileList = listdir('trainingDigits') #trainingDigits目录中的文件内容存储在列表中
m = len(trainingFileList) #得到列表中的文件数
trainingMat = zeros((m,1024)) #创建M*1024的训练矩阵,每行存储一个图形信息
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0] #得到文件名
classNumStr = int(fileStr.split('_')[0])#得到标签
hwLabels.append(classNumStr)
trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr) #载入图像信息
testFileList = listdir('testDigits') #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 errors is: %d" % errorCount #错误数
print "\nthe total error rate is: %f" % (errorCount/float(mTest)) #总的错误率
顺便讨论下split函数的用法,
按某一字符分割
str = 'WWW.baidu.com'
print str
str_split = str.split('.')
print str_split
WWW.baidu.com
['WWW', 'baidu', 'com']
按某一字符分割n次,当n大于实际的分割数时,返回最大的分割状态,n=2,效果和n=3、4、5、、n等等是一样的
str_split = str.split('.',2)
n=1时,
str_split = str.split('.',1)
['WWW', 'baidu.com']
还可以赋值给变量
str = 'WWW.baidu.com'
[str_split0,str_split1] = str.split('.',1)
print str_split0
print str_split1
结果如下
WWW
baidu.com
split字符分割用法参照 h t t p://my.oschina.net/hkmax/blog/146553