机器学习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的常见命令注入威胁
Feb 18 Python
用Python制作检测Linux运行信息的工具的教程
Apr 01 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python变量命名的7条建议
Jul 04 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
如何将json数据转换为python数据
Sep 04 Python
用python读取xlsx文件
Dec 17 Python
浅析python实现动态规划背包问题
Dec 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
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
2013/01/29 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
node.js中的path.sep方法使用说明
2014/12/08 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
python线程池的实现实例
2013/11/18 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
浅析Python中的赋值和深浅拷贝
2017/08/15 Python
python安装教程
2018/02/28 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
二人合伙经营协议书
2014/09/13 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
滴水洞导游词
2015/02/10 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
小学总务工作总结
2015/08/13 职场文书
素质教育学习心得体会
2016/01/19 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python