机器学习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运行效率的方法之间的对比
Apr 03 Python
利用python发送和接收邮件
Sep 27 Python
Python中扩展包的安装方法详解
Jun 14 Python
Python 多进程并发操作中进程池Pool的实例
Nov 01 Python
Python实现的端口扫描功能示例
Apr 08 Python
django解决跨域请求的问题详解
Jan 20 Python
python re库的正则表达式入门学习教程
Mar 08 Python
详解Python locals()的陷阱
Mar 26 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
Python OpenCV实现传统图片格式与base64转换
Jun 13 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和ACCESS写聊天室(六)
2006/10/09 PHP
MySQL授权问题总结
2007/05/06 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
JavaScript中九种常用排序算法
2014/09/02 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
JS重载实现方法分析
2016/12/16 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
基于pako.js实现gzip的压缩和解压功能示例
2017/06/13 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python实现简单的代理服务器
2015/07/25 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python模块hashlib(加密服务)知识点讲解
2019/11/25 Python
Linux下升级安装python3.8并配置pip及yum的教程
2020/01/02 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
如何用SQL语句进行模糊查找
2015/09/25 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
求职信内容怎么写
2014/05/26 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
浅谈pytorch中的dropout的概率p
2021/05/27 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL