机器学习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中lambda函数 list comprehension 和 zip函数使用指南
Sep 28 Python
在Django的URLconf中使用多个视图前缀的方法
Jul 18 Python
Python上下文管理器和with块详解
Sep 09 Python
python基本语法练习实例
Sep 19 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
Python正则表达式和元字符详解
Nov 29 Python
python 整数越界问题详解
Jun 27 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
Feb 23 Python
pyqt5中动画的使用详解
Apr 01 Python
通过代码简单了解django model序列化作用
Nov 12 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 获取mysql数据库信息代码
2009/03/12 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
PHP+MySQL实现模糊查询员工信息功能示例
2018/06/01 PHP
Javascript this指针
2009/07/30 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
Nodejs中 npm常用命令详解
2016/07/04 NodeJs
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
javascript+html5+css3自定义提示窗口
2017/06/21 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
JavaScript Blob对象原理及用法详解
2020/10/14 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python验证企业工商注册码
2015/10/25 Python
python web框架学习笔记
2016/05/03 Python
CentOS6.5设置Django开发环境
2016/10/13 Python
Scrapy使用的基本流程与实例讲解
2018/10/21 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
简单的Python人脸识别系统
2020/07/14 Python
公司离职证明范本
2014/01/13 职场文书
高考寄语大全
2014/04/08 职场文书
护理目标管理责任书
2014/07/25 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL