机器学习python实战之手写数字识别


Posted in Python onNovember 01, 2017

看了上一篇内容之后,相信对K近邻算法有了一个清晰的认识,今天的内容——手写数字识别是对上一篇内容的延续,这里也是为了自己能更熟练的掌握k-NN算法。

我们有大约2000个训练样本和1000个左右测试样本,训练样本所在的文件夹是trainingDigits,测试样本所在的文件夹是testDigits。文本文件中是0~9的数字,但是是用二值图表示出来的,如图。我们要做的就是使用训练样本训练模型,并用测试样本来检测模型的性能。

机器学习python实战之手写数字识别

首先,我们需要将文本文件中的内容转化为向量,因为图片大小是32*32,所以我们可以将其转化为1*1024的向量。具体代码实现如下:

def img2vector(filename):
  imgVec = zeros((1,1024))
  file = open(filename)
  for i in range(32):
    lines = file.readline()
    for j in range(32):
      imgVec[0,32*i+j] = lines[j]
  return imgVec

实现了图片到向量的转化之后,我们就可以对测试文件中的内容进行识别了。这里的识别我们可以使用上一篇中的自定义函数classify0,这个函数的第一个参数是测试向量,第二个参数是训练数据集,第三个参数是训练集的标签。所以,我们首先需要将训练数据集转化为(1934*1024)的矩阵,1934这里是训练集的组数即trainingDigits目录下的文件数,其对应的标签转化为(1*1934)的向量。之后要编写的代码就是对测试数据集中的每个文本文件进行识别,也就是需要将每个文件都转化成一个(1*1024)的向量,再传入classify0函数的第一个形参。整体代码如下:

def handWriteNumClassTest():
  NumLabels = []
  TrainingDirfile = listdir(r'D:\ipython\num_recognize\trainingDigits')#文件目录
  L = len(TrainingDirfile)  #该目录中有多少文件
  TrainMat = zeros((L,1024))
  for i in range(L):
    file_n = TrainingDirfile[i]
    fileName = file_n.split('.')[0]
    ClassName = int(file_n.split('_')[0])
    NumLabels.append(ClassName)
    TrainMat[i,:] = img2vector(r'D:\ipython\num_recognize\trainingDigits\%s'%file_n)
  TestfileDir = listdir(r'D:\ipython\num_recognize\testDigits')
  error_cnt = 0.0
  M = len(TestfileDir)
  for j in range(M):
    Testfile = TestfileDir[j]
    TestfileName = Testfile.split('.')[0]
    TestClassName = int(Testfile.split('_')[0])
    TestVector = img2vector(r'D:\ipython\num_recognize\testDigits\%s'%Testfile)
    result = classify0(TestVector,TrainMat,NumLabels,3)
    print('the result is %d,the real answer is %d\n'%(result,TestClassName))
    if result!=TestClassName:
      error_cnt+=1
  print('the total num of errors is %f\n'%error_cnt)
  print('the error rate is %f\n'%(error_cnt/float(M)))

这里需要首先导入listdir方法,from os import listdir,它可以列出给定目录的文件名。对于测试的每个文件,如果识别的分类结果跟真实结果不一样,则错误数+1,最终用错误数/测试总数 来表示该模型的性能。下面给出结果

机器学习python实战之手写数字识别

这里测试的总共946个项目中,一共有10个出现了错误,出错率为1%,这个性能还是可以接受的。有了上一篇内容的理解,这篇就简单多了吧!

训练数据集和测试集文件下载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取list下标及其值的简单方法
Sep 12 Python
对python添加模块路径的三种方法总结
Oct 16 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
python截取两个单词之间的内容方法
Dec 25 Python
python实现整数的二进制循环移位
Mar 08 Python
python cumsum函数的具体使用
Jul 29 Python
基于python框架Scrapy爬取自己的博客内容过程详解
Aug 05 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Python程序暂停的正常处理方法
Nov 07 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
Python流程控制语句的深入讲解
Jun 15 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
Python定时器实例代码
Nov 01 #Python
机器学习python实战之决策树
Nov 01 #Python
详解Python开发中如何使用Hook技巧
Nov 01 #Python
python利用标准库如何获取本地IP示例详解
Nov 01 #Python
你眼中的Python大牛 应该都有这份书单
Oct 31 #Python
Python生成数字图片代码分享
Oct 31 #Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 #Python
You might like
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
Laravel框架基于ajax实现二级联动功能示例
2019/01/17 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
js实现继承的5种方式
2015/12/01 Javascript
Javascript基础回顾之(一) 类型
2017/01/31 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
JavaScript文本特效实例小结【3个示例】
2018/12/22 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
vant 中van-list的用法说明
2020/11/11 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python实现简单登录验证
2016/04/13 Python
Python wxpython模块响应鼠标拖动事件操作示例
2018/08/23 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
Python基于paramunittest模块实现excl参数化
2020/04/26 Python
个人总结与自我评价
2014/09/18 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
教育读书笔记
2015/07/02 职场文书
js Proxy的原理详解
2021/05/25 Javascript