机器学习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实现dict版图遍历示例
Feb 19 Python
使用python实现扫描端口示例
Mar 29 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
使用coverage统计python web项目代码覆盖率的方法详解
Aug 05 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
pytorch梯度剪裁方式
Feb 04 Python
通过python连接Linux命令行代码实例
Feb 18 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
Feb 25 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
基于php伪静态的实现详细介绍
2013/04/28 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
php微信公众号开发之微信企业付款给个人
2018/10/04 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
vue使用vuex实现首页导航切换不同路由的方法
2019/05/08 Javascript
JavaScript动态检测密码强度原理及实现方法详解
2019/06/11 Javascript
微信sdk实现禁止微信分享(使用原生php实现)
2019/11/15 Javascript
[25:59]Newbee vs TNC 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python获取邮件地址的方法
2015/07/10 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
python dataframe NaN处理方式
2019/12/26 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
巴黎一票通:The Paris Pass
2018/02/10 全球购物
Windows和Linux动态库应用异同
2016/07/28 面试题
银行介绍信范文
2014/01/10 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
技校毕业生自荐信
2014/06/03 职场文书
启动仪式策划方案
2014/06/14 职场文书
重阳节标语大全
2014/10/07 职场文书
2014年预算员工作总结
2014/12/05 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
法制教育主题班会
2015/08/13 职场文书
再谈python_tkinter弹出对话框创建
2022/03/20 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技
python区块链实现简版工作量证明
2022/05/25 Python