机器学习实战-knn_手写识别

这个是《机器学习实战》的第二个实例,用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






你可能感兴趣的:(机器学习,knn,python,机器学习,手写识别)