机器学习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利用hook技术破解https的实例代码
Mar 25 Python
Python中optparse模块使用浅析
Jan 01 Python
python使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
python实现提取百度搜索结果的方法
May 19 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
python实现定时提取实时日志程序
Jun 22 Python
python线程定时器Timer实现原理解析
Nov 30 Python
python检查目录文件权限并修改目录文件权限的操作
Mar 11 Python
python 中关于pycharm选择运行环境的问题
Oct 31 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将字符分解为多个字符串的方法
2014/11/22 PHP
WordPress中用于创建以及获取侧边栏的PHP函数讲解
2015/12/29 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
python抓取并保存html页面时乱码问题的解决方法
2016/07/01 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
selenium+headless chrome爬虫的实现示例
2021/01/08 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
写好自荐信要注意的问题
2013/11/10 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
个人委托书怎么写
2014/04/04 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
教师节倡议书2015
2015/04/27 职场文书
退休教师追悼词
2015/06/23 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
Django框架中表单的用法
2022/06/10 Python