机器学习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中工作日类库Busines Holiday的介绍与使用
Jul 06 Python
Python命令行解析模块详解
Feb 01 Python
python3 requests中使用ip代理池随机生成ip的实例
May 07 Python
Python异常的检测和处理方法
Oct 26 Python
Python datetime和unix时间戳之间相互转换的讲解
Apr 01 Python
django框架自定义模板标签(template tag)操作示例
Jun 24 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python初步实现word2vec操作
Jun 09 Python
详解Python中的路径问题
Sep 02 Python
python向企业微信发送文字和图片消息的示例
Sep 28 Python
python实现定时发送邮件到指定邮箱
Dec 23 Python
python区块链持久化和命令行接口实现简版
May 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
PHP 定界符 使用技巧
2009/06/14 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
Javascript 学习书 推荐
2009/06/13 Javascript
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
2016/12/22 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
Python语言的12个基础知识点小结
2014/07/10 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python实现随机漫步功能
2018/07/09 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
Oracle的内存结构(Memory structures)
2015/06/10 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
十佳青年事迹材料
2014/08/21 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
审计局班子四风对照检查材料思想汇报
2014/10/07 职场文书
大学生暑期实践报告
2015/07/13 职场文书
Spring Data JPA使用JPQL与原生SQL进行查询的操作
2021/06/15 Java/Android
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android