用k-近邻算法:手写识别系统

用k-近邻算法:手写识别系统

一、准备数据:将图像转换为测试向量

我们将图像格式化处理为一个向量:把一个32x32的二进制图像矩阵转换为1x1024的向量。

还是在kNN.py文件中,编写将图像转换为向量的函数如下:

#将图像转换为测试向量
def img2vector(filename):
    returnVect = zeros((1, 1024))#创建一个1x1024的numpy数组
    fr = open(filename)#打开指定问价
    for i in range(32):#循环读出文件的前32行
        lineStr = fr.readline()#读取第i行,就一行
        for j in range(32):#将每行的前32个字符值存储在numpy数组中
            returnVect[0, 32*i+j]=int(lineStr[j])
    return returnVect

在命令行中输入:

>>> import kNN
>>> testVector = kNN.img2vector('/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/testDigits/0_2.txt')
>>> testVector[0, 0:31
>>> testVector[0, 32:63]

二、测试算法:使用k-近邻算法识别手写算法
 
 
还是在kNN.py文件中,测试分类器代码如下:
# 手写数字识别系统的测试代码
def handwritingClassTest():
    hwLabels = []  # 存储训练数据集的标签
    # 获取训练数据文件中的内容
    trainingFileList = listdir(
        '/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/trainingDigits')
    # 用listdir()返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序,将这些名字存放在一个列表中
    m = len(trainingFileList)  # 训练集中包含的图片总数
    trainingMat = zeros((m, 1024))  # 构造训练矩阵,该矩阵的每行数据存储一个图像

    # 从文件名中解析出分类数字
    for i in range(m):  # 遍历每个样本文件
        fileNameStr = trainingFileList[i]  # 第i个文件的名字
        fileStr = fileNameStr.split('.')[0]  # 以.为分割将名字分割为字符串数组
        classNumStr = int(fileStr.split('_')[0])  # 实现了从文件名中解析分类数字
        hwLabels.append(classNumStr)
        trainingMat[i, :] = img2vector(
            '/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/trainingDigits/%s' % fileNameStr)

    testFileList = listdir('/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/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(
            '/Users/lb1/Desktop/小学伴-机器学习/机器学习实战源代码/machinelearninginaction/Ch02/digits/testDigits/$s' % fileNameStr)
        classifierResult = classify(vectorUnderTest, trainingMat, hwLabels, 3)

        print("the classifier came back with: %d, the real anser 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))
 
 
  1. 补充:os.listdir(): 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。

猜你喜欢

转载自blog.csdn.net/zyy848877920/article/details/78978367