一.背景

手写数字识别是符号识别的一个分支,虽然只是识别简单的10个数字,但却有着非常大的实用价值。在我们的日常生活中,每天都要进行大量的文档处理工作,比如税单,银行支票,汇款单,信用卡账单的处理,以及邮局信函的分检等等,如何利用计算机字符识别和文档处理技术,使人们从这些繁重的手工劳动中解放出来已成为个迫切需要解决的问题。另外随着平板电脑和触摸屏手机的普及,手写输入成为了很多人的主要输入方式。手写数字虽然只有10个种类,但很多情況下对识别的精度要求非常高,而且每个人都有不同的字迹,要做到准确地识别还是有一定难度的。况且在实际应用中,手写数字识别的精确度要求要比汉字严格的多,因为数字识别经常用在财务、金融等领域。

二.数据集

数据集采用scikit-learn中的自带数据中的手写数字,数据集来源:
https://archive.ics.uci.edu/ml/datasets/Pen-Based+Recognition+of+Handwritten+Digits,
这其中包括了1797张88的图像,每个图像,如下图所示,都是手写数字,为了计算机可以使用这样的88像素图形,我们必须首先将其转换为长度为64的特征向量。其中我们用到Python自带数据集中的digits.data和digits.target,data里面是1797个类似如图的样本,target里面是标签,也就是每张图片对应的数字。

数字0-9:

三.方法

采用共4种不同的方法:

  1. 多项逻辑回归(Multinomial Logistic Regression, MLR)
  2. 朴素贝叶斯高斯模型(Gaussian Model of Naive Bayesian, GNB)
  3. 线性判别分析((Linear Discriminant Analysis, LDA)
  4. 支持向量机(Support Vector Machine, SVM)

四.结果和讨论

  1. 多项逻辑回归结果

热力图:


图片说明:数字1的识别错误了10个,分别误判为一个3,一个6,两个8,六个9。

  1. 朴素贝叶斯高斯模型结果

    热力图:

  1. 线性判别分析结果

热力图:

  1. 支持向量机结果

    热力图:

五.结论

对于误判的数字,四种方法多多少少都有相同点,比如对于数字6,后三种方法都把一个数字1识别成了数字6;对于数字8,都有把数字9识别成了数字8;对于数字9,都有把数字0识别成了数字9。不论哪种方法,对有的数字都识别不清,说明有一些手写数字很难识别,可能是因为笔记不清晰,手写的不清楚会对机器的识别增加难度,这会在应用到实际生活中出现相同问题,即误判,比如有一些人可能写出来的数字有连笔或模糊不清,这就需要机器识别具有很高的精度,不然会造成损失和麻烦。

方法 正确率
多项逻辑回归 91.7%
朴素贝叶斯高斯模型 82.3%
线性判别分析 92.1%
支持向量机 91.7%

多项式逻辑回归,线性判别分析和支持向量机模型的正确率达到了90%以上,应用支持向量机模型的方法正确率最高,达到了96.9%,而朴素贝叶斯高斯模型则效果不太理想,正确率仅有82.3%,还需改进。

六.代码

import matplotlib.pyplot as plt
import numpy as npfrom sklearn.linear_model import LogisticRegression
from sklearn import datasets, svm, metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import LinearDiscriminantAnalysisimport seaborn as sns
from sklearn.metrics import confusion_matrix
digits = datasets.load_digits()#导入数据包#digits: bunch类型
print(type(digits))#digits 包含的数据结构,字典类型数据key,value
print('digits.keys() = ',digits.keys())#imgaes 是一个三维矩阵1797 张 8 * 8的图片
print('digits.images.shape = ',digits.images.shape)
print('digits.images = ',digits.images)
plt.gray()
plt.matshow(digits.images[0])
plt.matshow(digits.images[1])
plt.matshow(digits.images[2])
plt.matshow(digits.images[3])
plt.matshow(digits.images[4])
plt.matshow(digits.images[5])
plt.matshow(digits.images[6])
plt.matshow(digits.images[7])
plt.matshow(digits.images[8])
plt.matshow(digits.images[9])
plt.show()#show数字0-9示例#data中包含1797个样本,每个样本包括8*8像素的图像,其实就是将8*8 的images按行展开成一行
print('digits.data.shape = ',digits.data.shape)
print('digits.data = ',digits.data)
#target 是一个1797维度的Vector,指明每张图片的标签,也就是每张图片代表的数字
print('digits.target.shape = ',digits.target.shape)
print('digits.target = ',digits.target)
#数据集中所有标签值,[0,1,2,3,4,5,6,7,8,9]
print('digits.target_names.shape = ',digits.target_names.shape)
print('digits.target_names = ',digits.target_names)
print('digits.DESCR = ', digits.DESCR)images_and_labels = list(zip(digits.images, digits.target))
for index, (image, label) in enumerate(images_and_labels[:4]):
#subplot的含义是将图分成一个2行4列的区域,然后随着index变化来显示图片
plt.subplot(2, 4, index + 1)
#关掉图像的坐标
plt.axis('off')
#image是要绘制的图像或者数组,cmp是颜色图谱,
plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
#标题
plt.title('Training: %i' % label)plt.show()
n_samples = len(digits.images)
n_samples = len(digits.images)print('number of sample:%s' % n_samples)
data = digits.images.reshape((n_samples, -1))#创建一个分类器
classifier = LogisticRegression()#多项逻辑回归
#classifier = GaussianNB()朴素贝叶斯高斯模型
#classifier = LinearDiscriminantAnalysis()线性判别分析
#classifier = svm.SVC(gamma=0.001)支持向量机classifier.fit(data[:int(n_samples / 2)], digits.target[:int(n_samples / 2)])
expected = digits.target[int(n_samples / 2):]
predicted = classifier.predict(data[int(n_samples / 2):])
print("Classification report for classifier %s:\n%s\n"      % (classifier, metrics.classification_report(expected, predicted)))
print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted))
images_and_predictions = list(zip(digits.images[int(n_samples / 2):], predicted))
for index, (image, prediction) in enumerate(images_and_predictions[:4]):plt.subplot(2, 4, index + 5)plt.axis('off')plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')plt.title('Prediction: %i' % prediction)
plt.show()
#热力图
f, ax = plt.subplots(figsize = (6,4))
mat = confusion_matrix(expected, predicted)sns.heatmap(mat, square=True, annot=True, cbar=False,)plt.xlabel('predicted value')#横轴为预测值
plt.ylabel('true value')#纵轴为真实值
plt.show()

Python不同方法实现手写数字识别结果和代码相关推荐

  1. python svm实现手写数字识别——直接可用

    python svm实现手写数字识别--直接可用 1.训练 1.1.训练数据集下载--已转化成csv文件 1.2 .训练源码 2.预测单张图片 2.1.待预测图像 2.2.预测源码 2.3.预测结果 ...

  2. Python人工智能--实现手写数字识别

    文章目录 一.K-近邻算法(KNN)概述 二.Python实现 三.Python实现手写数字识别 四.K值选取对数据准确率的影响 在做此项目之前,首先要明白何为KNN算法. 一.K-近邻算法(KNN) ...

  3. python手写数字识别实验报告_机器学习python实战之手写数字识别

    看了上一篇内容之后,相信对K近邻算法有了一个清晰的认识,今天的内容--手写数字识别是对上一篇内容的延续,这里也是为了自己能更熟练的掌握k-NN算法. 我们有大约2000个训练样本和1000个左右测试样 ...

  4. 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别

    为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...

  5. 【手写数字识别】基于Lenet网络实现手写数字识别附matlab代码

    1 内容介绍 当今社会,人工智能得到快速发展,而模式识 别作为人工智能的一个重要应用领域也得到了飞 速发展,它利用计算机通过计算的方法根据样本的 特征对样本进行分类,其中的光学字符识别技术受 到广大研 ...

  6. python实现mnist手写数字识别

    看了<python神经网络编程>,跟着书上敲了一下mnist手写数字的代码,对神经网络有了初步的了解. 此项目为三层神经网络识别,激活函数采用sigmoid函数,数据集为mnist手写数字 ...

  7. 手写数字识别神经网络完整代码,带详细注释。

    神经网络使用的两个数据集:一个是训练集(60000条),一个是测试测试集(10000条),下载后直接放在程序目录下就可以了 mnist手写字体训练集6000条,mnist_train.csv mnis ...

  8. (一)Lenet5 手写数字识别原理及代码解析

    模型简单,本地可跑 论文参考:Gradient-based learning applied to document recognition MNIST手写数据集 50000个训练数据 10000个测 ...

  9. 利用python卷积神经网络手写数字识别_Keras深度学习:卷积神经网络手写数字识别...

    引言:最近在闭关学习中,由于多久没有写博客了,今天给大家带来学习的一些内容,还在学习神经网络的同学,跑一跑下面的代码,给你一些自信吧!Nice 奥里给! 正文:首先该impor的库就不多说了,不会的就 ...

最新文章

  1. 如何写出健壮的代码?
  2. 简单分析ComponentScan
  3. vs code html table,vs Code 快速生成代码
  4. 2019 ACM/ICPC 南昌站 G,拉格朗日插值
  5. mgr.dll病毒手工清除方法!
  6. python实战——密码生成器
  7. HTML页面返回503状态码设置,503错误网页状态码出现原因及监控方法介绍
  8. 未完成:读书笔记01芝加哥大学论文写作指南_Kate L. Turabian
  9. Running “flutter pub get“ in xxx... 报错: Git error 443
  10. 【Microsoft Azure 的1024种玩法】六十九.通过SSMS将本地自建SQL Server 数据库脱机迁移至Azure SQL Database
  11. TFN频谱仪为什么好用以150为例
  12. smartforms
  13. 阿里api文档链接地址
  14. CESM学习笔记(CIME)1 :介绍和query_config
  15. 关于numpy中的一维行向量、列向量的理解
  16. php字幕格式,如何给视频添加字幕 快速添加视频字幕|可设置文字样式、位置等...
  17. DSP2837d双核调试
  18. 八本最佳管理书籍,你读过几本?
  19. excel2016 卡_Excel情人节卡2016
  20. String Date Calendar之间的转换

热门文章

  1. Day87.二手房管理: 数据字典 (zTree组件)、小区管理
  2. [13]深入浅出工作开源框架Camunda:多实例并行用户任务
  3. 【力扣638】 大礼包问题 JAVA全过程详解,绝对易懂
  4. 百度开放云爱数,共推混合云!
  5. python爬虫接口_爬虫与API(上)
  6. js自动实现读取二维码内容
  7. 支付宝、360水滴、Vizio,盘点那些为了数据“拼了”的企业
  8. CakePHP 2.x CookBook 中文版 第五章 控制器
  9. 用matplotlib中在循环语句中显示多张图片
  10. 《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86