机器学习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+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
python3学生名片管理v2.0版
Nov 29 Python
python 字符串常用方法汇总详解
Sep 16 Python
python json 递归打印所有json子节点信息的例子
Feb 27 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
Python自动化操作实现图例绘制
Jul 09 Python
Python爬虫实例——爬取美团美食数据
Jul 15 Python
python 如何对logging日志封装
Dec 02 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 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/03/10 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
js left,right,mid函数
2008/06/10 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
js字符串操作总结(必看篇)
2016/11/22 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
JavaScript数据结构之数组的表示方法示例
2017/04/12 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
Javascript实现html转pdf高清版(提高分辨率)
2020/02/19 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
vue全局使用axios的操作
2020/09/08 Javascript
python实现redis三种cas事务操作
2017/12/19 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python 从相对路径下import的方法
2018/12/04 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
Aurora London官网:奢华、负担得起的皮革手袋
2020/08/01 全球购物
财务与信息服务专业推荐信
2013/11/28 职场文书
学习自我鉴定
2014/02/01 职场文书
进步之星获奖感言
2014/02/22 职场文书
公司投资建议书
2014/05/16 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
MySQL数据库 安全管理
2022/05/06 MySQL