美文网首页
KNN手写系统识别

KNN手写系统识别

作者: Yonginggg | 来源:发表于2019-08-03 10:39 被阅读0次

    过程

    1. 收集数据: 提供⽂本⽂件。

    2. 准备数据: 编写函数classify0(), 将图像格式转换为分类器使
      ⽤的list格式。

    3. 分析数据: 在Python命令提⽰符中检查数据, 确保它符合要求。

    4. 训练算法: 此步骤不适⽤于k近邻算法。

    5. 测试算法: 编写函数使⽤提供的部分数据集作为测试样本, 测试样
      本与⾮测试样本的区别在于测试样本是已经完成分类的数据, 如果
      预测分类与实际类别不同, 则标记为⼀个错误。

    6. 使⽤算法: 本例没有完成此步骤, 若你感兴趣可以构建完整的应⽤
      程序, 从图像中提取数字, 并完成数字识别, 美国的邮件分拣系统
      就是⼀个实际运⾏的类似系统。

    image

    为了使⽤前⾯两个例⼦的分类器, 我们必须将图像格式化处理为⼀个向量。 我们将把⼀个32x32的⼆进制图像矩阵转换为1x1024的向量, 这样前两节使⽤的分类器就可以处理数字图像信息了。

    完整代码实现

    from numpy import *
    from os import listdir
    import operator
    # 将图像转换成向量
    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
    # 测试img2vector
    # testVector = img2vector('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/testDigits/0_13.txt')
    # print(testVector[0,0:31])
    
    #数据分析 KNN
    def 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={}
        #❷ (以下两⾏) 选择距离最⼩的k个点
        for i in range(k):
            voteIlabel = labels[sortedDistIndicies[i]]
            classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        sortedClassCount = sorted(classCount.items(),
            #❸ 排序
            key=operator.itemgetter(1), reverse=True)
        return sortedClassCount[0][0]
    
    # ⼿写数字识别系统的测试代码
    def handwritingClassTest():
        hwLabels = []
        # 这段代码的主要功能是从os模块中导⼊函数listdir, 它可以列出给定⽬录的⽂件名
        trainingFileList = listdir('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/trainingDigits')           #load the training set
        # m=1934 共1934个文件
        m = len(trainingFileList)
        trainingMat = zeros((m,1024))
        for i in range(m):
            # (以下三⾏) 从⽂件名解析分类数字
            fileNameStr = trainingFileList[i]
            fileStr = fileNameStr.split('.')[0]     #take off .txt
            classNumStr = int(fileStr.split('_')[0])
            # 文件9_45.txt的分类是9,它是数字9的第45个实例
            hwLabels.append(classNumStr)
            trainingMat[i,:] = img2vector('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/trainingDigits/%s' % fileNameStr)
        # 用测试集去测试准确度
        testFileList = listdir('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/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('D:/Python Project/.vscode/Machine-learning-practical-notes/KNN/testDigits/%s' % fileNameStr)
            # KNN算法测验
            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)))
    
    handwritingClassTest()
    

    运行的结果

    image

    相关文章

      网友评论

          本文标题:KNN手写系统识别

          本文链接:https://www.haomeiwen.com/subject/cytjdctx.html