机器学习笔记(5)---K-近邻算法(3)---KNN手写识别系统

本文介绍了基于KNN算法的手写识别系统,通过训练数据建立分类算法,并使用测试数据进行验证,错误率约为1%。文章详细阐述了数据表示方法和程序实现过程。
摘要由CSDN通过智能技术生成

前言

前两篇文章《约会对象魅力程度分类》和《使用sklearn中的KNN算法》已经把KNN算法相关内容介绍完毕,从本节开始再举几个例子加深对KNN的理解。
本节主要记录MLiA中手写识别系统。
转载请注明出处:http://blog.csdn.net/rosetta

KNN手写识别系统

这节内容也是很简单的,不同之处在于原始数据表示方法不同而已。每个样本都是32行*32列=1024大小,所以使用一个1024大小的list存放一个样本。
训练数据trainingDigits目录,共1934个,测试数据testDigits目录,共946个。每个数字大概200个样本,样本的标签通过文件名标识,文件名下划线左边的就是该样本实际的数字,即标签了。
该程序先使用训练数据创建分类算法,然后使用testDigits数据进行测试。
具体细节可对照代码中的注释进行学习,注释已经很详细了。

#以下开始学习2.3节:手写识别系统
#该函数用于读取样本文字到list中。
#因为每个样本都是32行*32列=1024大小。所以这个返回什returnVect就是一个1024大小的list,存放了样本的数据。
def img2vector(filename):
    returnVect = np.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 img2vector_test():
    testVector = img2vector('testDigits/0_13.txt')
    print(testVector[0, 0:31])

#2.3.2 使用k-近邻算法识别手写数字。
#把2.1和2.2节真正学会了,这节其实是很简单的。不同之处在于原始数据表示方法不同而已。
def handwritingClassTest():
    hwLabels = []
    trainingFileList = listdir('trainingDigits')#获取训练数据文件名列表,一共1934个
    m = len(trainingFileList)#m=1934
    trainingMat = np.zeros((m,1024))#创建1934行,每行1024列。
    for i in range(m):
        fileNameStr = trainingFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        classNumStr = int(fileStr.split('_')[0])#每个样本的标签通过文件名标识,文件名下划线左边的就是该样本实际的数字,所以程序先解析这些数据,把它们存在hwLabels中。
        hwLabels.append(classNumStr)
        trainingMat[i,:] = img2vector('trainingDigits/%s' % fileNameStr)#获取训练样本的属性特征。

    #以下开始获取测试样本的属性特征和标签,和上述获取训练数据时是一样的,只不过本实例是一条一条测试,
    #其实可使用sklearn KNN相关算法先把测试样本的属性和标签存下来,然后调用相应接口即可。
    testFileList = listdir('testDigits')        #iterate through the test set
    errorCount = 0.0
    mTest = len(testFileList)
    for i in range(mTest):
        fileNameStr = testFileList[i]
        fileStr = fileNameStr.split('.')[0]     #take off .txt
        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)))

main中调用的地方:

#以下开始学习2.3节:手写识别系统
#8、2.3.1将图像转换为测试向量。
# img2vector_test()

#9、2.3.2 使用k-近邻算法识别手写数字。
handwritingClassTest()

运行结果如下,错误率大概1%多点。
手写识别系统运行结果

至此KNN手写识别系统介绍完毕。

如有疑问之处欢迎加我微信交流,共同进步!请备注“CSDN博客”
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值