机器学习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编程中实现迭代器的一些技巧小结
Jun 21 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
Python开发的实用计算器完整实例
May 10 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
Python如何转换字符串大小写
Jun 04 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
Sep 03 Python
Django-celery-beat动态添加周期性任务实现过程解析
Nov 26 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原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
node.js从数据库获取数据
2016/05/08 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
[03:41]2018完美盛典-《Fight With Us》
2018/12/16 DOTA
Python入门篇之数字
2014/10/20 Python
python获得一个月有多少天的方法
2015/06/04 Python
Python的IDEL增加清屏功能实例
2017/06/19 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python脚本第一行如何写
2020/08/30 Python
python中pow函数用法及功能说明
2020/12/04 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
终端业务员岗位职责
2013/11/27 职场文书
初中生自我鉴定
2014/02/04 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
六年级学生评语
2014/04/22 职场文书
学生会辞职信
2015/03/02 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
导游词之唐山景点
2019/12/18 职场文书