KNN算法实现手写识别系统

来源:互联网 发布:淘宝设置发货地 编辑:程序博客网 时间:2024/05/02 05:06

'''Created on 2015-3-13@author: lzy'''from numpy import *import operatorfrom os import listdirdef classify0(inX,dataSet,labels,k):    dataSetSize = dataSet.shape[0]    diffMat = tile(inX, (dataSetSize,1)) - dataSet    sqDiffMat = diffMat**2    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances**0.5    sortedDistIndicies = distances.argsort()         classCount={}              for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)    return sortedClassCount[0][0]def image2vector(filename):    returnVect = zeros((1,1024))    fr = open(filename)    for i in range(32):        linestr = fr.readline()        for j in range(32):            returnVect[0,i*32 + j] = int(linestr[j])    return returnVectdef handwritingClassTest():    hwLabels = []    trainingFileList = listdir('trainingDigits')    m = len(trainingFileList)    trainingMat = zeros((m,1024))    for i in range(m):        filenameStr = trainingFileList[i]        fileStr = filenameStr.split('.')[0]        classNumStr = int(fileStr.split('_')[0])        hwLabels.append(classNumStr)        trainingMat[i,:] = image2vector('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 = image2vector('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 "the total error rate is %f" % (errorCount / float(mTest))        handwritingClassTest()


运行结果:the total error rate is 0.011628

    classifiy0实现了KNN分类算法;image2vector是将图片转换为一维向量的形式,这里的图像是经过处理的32像素*32像素的黑白图像;handwritingClassTest则是训练数据、预测数据;该算法的准确率为0.011628。

    numpy.tile(A,reps)是把A重复reps次来构造数组;

    argsort函数返回的是数组值从小到大的索引值

    from os import listdir 这段代码的主要功能是从os模块中导入函数listdir,它可以列出给定目录的文件名。


0 0
原创粉丝点击