机器学习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基础教程之对象和类的实际运用
Aug 29 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
基于python实现名片管理系统
Nov 30 Python
Python语言进阶知识点总结
May 28 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
pytorch GAN伪造手写体mnist数据集方式
Jan 10 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
Python使用pyexecjs代码案例解析
Jul 13 Python
基于Python实现粒子滤波效果
Dec 01 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
python实现图片批量压缩
Apr 24 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中UTF8编码的中文排序实例
2014/10/21 PHP
smarty模板引擎从配置文件中获取数据的方法
2015/01/22 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
解决JS浮点数运算出现Bug的方法
2013/03/12 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
在Linux系统中搭建Node.js开发环境的简单步骤讲解
2016/01/26 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
2016/05/05 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JS使用插件cryptojs进行加密解密数据实例
2017/05/11 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python XML RPC服务器端和客户端实例
2014/11/22 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python之Character string(实例讲解)
2017/09/25 Python
Python实现的三层BP神经网络算法示例
2018/02/07 Python
Python基础教程之异常详解
2019/01/10 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
在PyTorch中使用标签平滑正则化的问题
2020/04/03 Python
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
计算机网络专业个人的自我评价
2013/10/17 职场文书
大学生个人推荐信范文
2013/11/25 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
2015新学期开学寄语
2015/02/26 职场文书
统计员岗位职责范本
2015/04/14 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书