我是靠谱客的博主 发嗲柠檬,最近开发中收集的这篇文章主要介绍机器学习整理笔记——使用k-近邻算法对手写识别系统的测试k-近邻算法对手写识别系统的测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前言:以下是本人通过《Machine Learning in Action》学习机器学习时总结的学习笔记,本文的目的是提炼出简洁易懂的精华,让在学习机器学习的Guys能轻松就融会贯通。希望对读者有用!
环境:Linux-Ubuntu
语言:Python
旁白:在学习的过程中还能熟悉Linux下的Python编程。

k-近邻算法对手写识别系统的测试

上一节介绍了kNN算法原理以及一个简单应用,本节我们将进一步构造使用kNN分类器的手写识别系统。为了简单起见,这里的构造系统只能识别数字0~9,如图所示分别为数字2、6、7。我提供了大约2000个手写数字的例子(每个例子大小都是32x32=1024的图像信息)在目录trainingDigits,每个数字有200个样本;在目录testDigits中包含了大约900个测试数据。我们使用目录trainingDigits中的数据作为已知分类样本训练分类器(实际上这里还不算训练),使用目录testDigits中的数据测试分类器效果,两组数据没有重叠。(数据在我的资源里面,自己去下载)


首先要读入数据,所以我们在kNN.py文件中编写一个函数Img2Vector()将图像文件转换为向量(1x1024大小的Numpy数组),然后返回数组。

程序清单1:

  def Img2Vector(filename):
  # initiate a vector named 'Vector' as a '0' matrix with size 1x1024
      Vector = zeros((1, 1024))
  # open a file named 'filename'
      fr = open(filename)
  # assignment Vector
      for i in range(32):
          lineStr = fr.readline() #这里把文件里的数据按行读取,每运行一次就往下读取一行
          for j in range(32):
              Vector[0, 32*i+j] = int(lineStr[j])
      return Vector



现在让我们测试一下程序,在Python命令行里输入下列命令:

>>>reload(kNN)

>>>testVector = kNN.Img2Vector('test.Digits/0_13.txt')

>>>testVector[0,0:31]

好了,将数据处理成分类器能识别的格式之后,我们将这些数据输入到分类器里,检测分类器的执行结果。程序清单2所示的函数'HandWritingClassTest()'是测试分类器的代码,同样将其写入kNN.py文件中。在写入之前我们必须确保将“from os import listdir”写入文件的起始部分,这段代码主要功能时从os模块中导入函数listdir,它可以列出给定目录的文件名。

程序清单2:

from os import listdir
  def 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, :] = Img2Vector('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])
         vectorTest = Img2Vector('testDigits/%s' % fileNameStr)
         classifierResult = Classify(vectorTest, trainingMat, hwLabels, 100)
         print "%s : the classifier came back with: %d, the real answer is: %d" % (fileNameStr, 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))
在程序清单2中,我们将trainingDigits目录中的文件内容存储在列表trainingFileList中,并将其个数存储在m中。接着,代码创建一个m行1024列的矩阵存储一个图像。下一步,我们对testDigits目录进行相似的操作,并用Classify()进行分类测试,在Python命令行输入:

>>reload(kNN)

>>kNN.HandWritingClassTest()


可见,错误率有1.2%(这个错误率实际上很大了),可见这个分类方法不是很理想,后面我们还会介绍其他方法。

最后

以上就是发嗲柠檬为你收集整理的机器学习整理笔记——使用k-近邻算法对手写识别系统的测试k-近邻算法对手写识别系统的测试的全部内容,希望文章能够帮你解决机器学习整理笔记——使用k-近邻算法对手写识别系统的测试k-近邻算法对手写识别系统的测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部