10.机器学习sklearn-------手写数字识别实例
1.概念介绍:
图像识别(Image Recognition)是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。
图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。机器学习领域一般将此类识别问题转化为分类问题。
手写识别是常见的图像识别任务。计算机通过手写体图片来识别出图片中的字,与印刷字体不同的是,不同人的手写体风格迥异,大小不一, 造成了计算机对手写识别任务的一些困难。
数字手写体识别由于其有限的类别(0~9共10个数字)成为了相对简单 的手写识别任务。DBRHD和MNIST是常用的两个数字手写识别数据集
2.数据介绍:
MNIST的下载链接:http://yann.lecun.com/exdb/mnist/。
MNIST是一个包含数字0~9的手写体图片数据集,图片已归一化为以手写数 字为中心的28*28规格的图片。
MNIST由训练集与测试集两个部分组成,各部分 规模如下:
训练集:60,000个手写体图片及对应标签
测试集:10,000个手写体图片及对应标签
DBRHD(Pen-Based Recognition of Handwritten Digits Data Set)是UCI的机器学习中心提供的数字手写体数据库: https://archive.ics.uci.edu/ml/datasets/PenBased+Recognition+of+Handwritten+Digits。
DBRHD数据集包含大量的数字0~9的手写体图片,这些图片来源于44位不同的人的手写数字,图片已归一化为以手写数字为中心的32*32规格的图片。
DBRHD的训练集与测试 集组成如下:
训练集:7,494个手写体图片及对应标签,来源于40位手写者
测试集:3,498个手写体图片及对应标签,来源于14位手写者
3.任务过程:
①输入
②输出
③MPL的结构
④步骤
import numpy as np #使用listdir模块,用于访问本地文件 from os import listdir from sklearn.neural_network import MLPClassifier#定义img2vector函数,将加载的32*32 的图片矩阵展开成一列向量 def img2vector(fileName):retMat =np.zeros([1024],int)fr = open(fileName) #打开包含32*32大小的数字文件 lines =fr.readlines() #读取文件的所有行 for i in range(32):for j in range(32): #将01数字存放在retMat retMat[i*32+j]=lines[i][j];return retMat #并将样本标签转化为one-hot向量 def readDataSet(path):fileList =listdir(path) #获取文件夹下所有文件 numFiles =len(fileList) #统计需要读取的文件的数目 dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件 hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot for i in range(numFiles):filePath =fileList[i] #获取文件名称/路径 digit =int(filePath.split('_')[0])hwLabels[i][digit]=1.0 dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容 return dataSet,hwLabels train_dataSet,train_hwLabels =readDataSet('trainingDigits')#构建神经网络:设置网络的隐藏层数、各隐藏层神经元个数、 # 激活函数、学习率、优化方法、最大迭代次数。 #hidden_layer_sizes 存放的是一个元组,表示第i层隐藏层里神经元的个数 # 使用logistic激活函数和adam优化方法,并令初始学习率为0.0001 clf =MLPClassifier(hidden_layer_sizes=(50,),activation='logistic', solver='adam',learning_rate_init=0.0001,max_iter=2000) #fit函数能够根据训练集及对应标签集自动设置多层感知机的输入与输出层的神经元个数。 #例如train_dataSet为n*1024的矩阵,train_hwLabels为n*10的矩阵, # 则fit函数将MLP的输入层神经元个数设为1024,输出层神经元个数为 10. clf.fit(train_dataSet,train_hwLabels)#测试集评价 dataSet,hwlLabels =readDataSet('testDigits') res=clf.predict(dataSet) #对测试集进行预测 error_num =0 #统计预测错误的数目 num =len(dataSet) #测试集的数目 for i in range(num):#比较长度为10的数组,返回包含01的数组,0为不同,1为相同 if np.sum(res[i]==hwlLabels[i])<10:error_num+=1 print("Total num:",num,"Wrong num:",error_num," WrongRate:",error_num/float(num))
实验效果:
以下结果为课程结果,我自己实验的结果与这个结果相差不大。
2.使用KNN分类器识别数据集DBRHD的手写数字(内容与上面差不多,只是使用算法有些差别)
import numpy as np #使用listdir模块,用于访问本地文件 from os import listdir from sklearn import neighbors#定义img2vector函数,将加载的32*32 的图片矩阵展开成一列向量 def img2vector(fileName):retMat =np.zeros([1024],int)fr = open(fileName) #打开包含32*32大小的数字文件 lines =fr.readlines() #读取文件的所有行 for i in range(32):for j in range(32): #将01数字存放在retMat retMat[i*32+j]=lines[i][j];return retMat #并将样本标签转化为one-hot向量 def readDataSet(path):fileList =listdir(path) #获取文件夹下所有文件 numFiles =len(fileList) #统计需要读取的文件的数目 dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件 hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot for i in range(numFiles):filePath =fileList[i] #获取文件名称/路径 digit =int(filePath.split('_')[0])hwLabels[i][digit]=1.0 dataSet[i]=img2vector(path+'/'+filePath)#读取文件内容 return dataSet,hwLabels train_dataSet,train_hwLabels =readDataSet('trainingDigits') #构建KNN分类器:设置查找算法以及邻居点 数量(k)值。 #KNN是一种懒惰学习法,没有学习过程,只在预测时去查找最近邻的点, #数据集的输入就是构建KNN分类器的过程 knn =neighbors.KNeighborsClassifier(algorithm='kd_tree',n_neighbors=3) knn.fit(train_dataSet,train_hwLabels)#测试集评价 dataSet,hwlLabels =readDataSet('testDigits') res=knn.predict(dataSet) #对测试集进行预测 error_num =np.sum(res!=hwlLabels) #统计预测错误的数目 num =len(dataSet) #测试集的数目 print("Total num:",num,"Wrong num:",error_num," WrongRate:",error_num/float(num))
实验结果(同上)
10.机器学习sklearn-------手写数字识别实例相关推荐
- 机器学习:手写数字识别(Hand-written digits recognition)小项目
该项目的所有代码在我的github上,欢迎有兴趣的同学与我探讨研究~ 地址:Machine-Learning/machine-learning-ex3/ 1. Introduction 手写数字识别( ...
- 利用机器学习进行手写数字识别
本次案例中,我们的目标是从数万个手写图像的数据集中正确识别数字. 数据介绍: 数据文件 train.csv 和 test.csv 包含从 0 到 9 的手绘数字的灰度图像. 每个图像高 28 像素,宽 ...
- 机器学习之手写数字识别大作业报告
写在前面 在选择特征的时候,曾纠结过是用颜色矩.像素值还是图片卷积过后的值作为特征,我选择了后者,因为个人觉得手写数字识别相对于水质颜色识别来说,更关注图片的二维结构信息,如果用颜色矩或者像素值作为特 ...
- Python实现基于机器学习的手写数字识别系统
目 录 摘要 I ABSTRACT II 1 绪论 1 1.1 数字识别研究现状 1 1.2 深度学习的发展与现状 1 1.3 研究意义 2 1.4 论文结构 3 2 卷积神经网络基本原理 4 2.1 ...
- linux手写数字识别opencv,opencv实现KNN手写数字的识别
人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...
- 在OpenCV里使用机器学习库sklearn 实现手写数字识别1
前面学习过KNN的方式来实现手写数字识别,不过效果一般,那么有没有别的方法来试一试,或许可以改进一点呢.在本文里将要介绍使用SVM和HOG的方式来实现手写数字识别,比如最终结果如下图: 在这个例子里与 ...
- 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别
机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...
- 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)
文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...
- 机器学习笔记——从手写数字识别开始
文章目录 前言 关于这篇博客(预计八月下旬全部完成) 关于项目实现 监督学习 ANN全连接神经网络的实现 1.总述 2.初始化 3.传播及损失 4.反向传播 决策树以及随机森林的实现 1.总述 2.单 ...
- 机器学习之KNN结合微信机器人实现手写数字识别终极API
机器学习之KNN结合微信机器人实现手写数字识别终极API 手写数字识别 功能概述 实现步骤 结果展示 改进之处和TIPS 手写数字识别 功能概述 微信机器人接收到的手写数字图片,传送给已经经过机器学习 ...
最新文章
- DM8168 OpenCV尝试与评估(编译ARM版OpenCV)
- zemax操作数_ZEMAX与像差理论:二级光谱的ZEMAX描述与详解
- 旅途人物之二:幸福的孩子们
- subroutines of perl
- [精华] 讨论 Setsockopt选项
- 非常实用的Python库
- 快速遍历目录下所有文件名
- PostgreSQL 之 分区表
- 进入传奇荣耀显示服务器不存在,传奇荣耀————【合区】5月10日合区公告
- 进入显示器工厂模式的方法 【95种品牌 维修珍藏资料】
- UBUNTU 8.04系统美化
- HTML+CSS静态页面`西安旅游网站设计——西安旅游(7页) 大学生旅游网页作品 出行网页设计作业模板 学生游玩网页制作源代码下载
- 为什么浏览器全面禁用三方 Cookie
- 尚德机构COO杜铮:在线教育进入下半场 释放供给侧红利成关键
- go每日新闻(2021-08-29)——Go程序内存假泄漏是怎么回事
- 原来手机还能当做扫描仪?安卓苹果都可以,纸质稿轻松电子化
- Babel 是什么?· Babel 中文文档
- 蓝桥杯算法提高 小写转换为大写
- matlab中Svmtrain和Svmpredict的用法
- Python正则表达式模式