机器学习实战2.3. k-近邻算法例子-识别手写数字
机器学习实战2.3. k-近邻算法例子-识别手写数字
搜索微信公众号:‘AI-ming3526’或者’计算机视觉这件小事’ 获取更多机器学习干货
csdn:https://blog.csdn.net/baidu_31657889/
github:https://github.com/aimi-cn/AILearners
本文参考地址:[apachecn/AiLearning]
本文出现的所有代码,均可在github上下载,不妨来个Star把谢谢~:Github代码地址
项目案例2: 识别手写数字
完整代码地址
1 实战背景
对于需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素x32像素。尽管采用本文格式存储图像不能有效地利用内存空间,但是为了方便理解,我们将图片转换为文本格式,数字的文本格式如图所示。
与此同时,这些文本格式存储的数字的文件命名也很有特点,格式为:数字的值_该数字的样本序号,如图所示
对于这样已经整理好的文本,我们可以直接使用Python处理,进行数字预测。数据集分为训练集和测试集,使用上小结的方法,自己设计k-近邻算法分类器,可以实现分类。
数据集下载
2 开发流程
收集数据:提供文本文件。 准备数据:编写函数 img2vector(), 将图像格式转换为分类器使用的向量格式 数据下载见上面
分析数据:在Python 命令提示符中检查数据,确保它符合要求 训练算法:此步骤不适用于 KNN
测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误
使用算法:本例没有完成此步骤,若你感兴趣可以构建完整的应用程序,从图像中提取数字,并完成数字识别,美国的邮件分拣系统就是一个实际运行的类似系统
准备数据: 编写函数 img2vector(), 将图像文本数据转换为分类器使用的向量
将图像文本数据转换为向量
def img2vector(filename):returnVect = zeros((1,1024))fr = open(filename)for i in range(32):lineStr = fr.readline()for j in range(32):returnVect[0,32*i+j] = int(lineStr[j])return returnVect
分析数据:在 Python 命令提示符中检查数据,确保它符合要求
在 Python 命令行中输入下列命令测试 img2vector 函数,然后与文本编辑器打开的文件进行比较:
>>> testVector = kNN.img2vector('testDigits/0_13.txt')
>>> testVector[0,0:32]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> testVector[0,32:64]
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
训练算法:此步骤不适用于 KNN
因为测试数据每一次都要与全量的训练数据进行比较,所以这个过程是没有必要的。
测试算法:编写函数使用提供的部分数据集作为测试样本,如果预测分类与实际类别不同,则标记为一个错误
def handwritingClassTest():# 1. 导入训练数据hwLabels = []trainingFileList = listdir('data/2.KNN/trainingDigits') # load the training setm = len(trainingFileList)trainingMat = zeros((m, 1024))# hwLabels存储0~9对应的index位置, trainingMat存放的每个位置对应的图片向量for i in range(m):fileNameStr = trainingFileList[i]fileStr = fileNameStr.split('.')[0] # take off .txtclassNumStr = int(fileStr.split('_')[0])hwLabels.append(classNumStr)# 将 32*32的矩阵->1*1024的矩阵trainingMat[i, :] = img2vector('data/2.KNN/trainingDigits/%s' % fileNameStr)# 2. 导入测试数据testFileList = listdir('data/2.KNN/testDigits') # iterate through the test seterrorCount = 0.0mTest = len(testFileList)for i in range(mTest):fileNameStr = testFileList[i]fileStr = fileNameStr.split('.')[0] # take off .txtclassNumStr = int(fileStr.split('_')[0])vectorUnderTest = img2vector('data/2.KNN/testDigits/%s' % fileNameStr)classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)print "the classifier came back with: %d, the real answer is: %d" % (classifierResult, classNumStr)if (classifierResult != classNumStr): errorCount += 1.0print "\nthe total number of errors is: %d" % errorCountprint "\nthe total error rate is: %f" % (errorCount / float(mTest))
使用算法:本例没有完成此步骤,若你感兴趣可以构建完整的应用程序,从图像中提取数字,并完成数字识别,美国的邮件分拣系统就是一个实际运行的类似系统。
结果展示
可以看出总共识别出错的个数为11
错误率:0.011628效果还是很不错的
扩展: Scikit learn 也简称sklearn,是机器学习领域当中最知名的python模块之一。
使用sklearn可以很方便地让我们实现一个机器学习算法。一个复杂度算法的实现,使用sklearn可能只需要调用几行API即可。所以学习sklearn,可以有效减少我们特定任务的实现周期。
sklearn中文文档
使用sklearn实现手写数字识别:
完整代码地址
AIMI-CN AI学习交流群【1015286623】 获取更多AI资料
扫码加群:
分享技术,乐享生活:我们的公众号计算机视觉这件小事每周推送“AI”系列资讯类文章,欢迎您的关注!
机器学习实战2.3. k-近邻算法例子-识别手写数字相关推荐
- 机器学习实战第二章K近邻算法照葫芦画瓢实践。
分别实现了最基本的3个DEMO 1.给你若干个带有标签的二维点作为训练集,给定一系列的二维随机点,看其通过训练集,可以被分为哪一类 2.给你N个人的飞行里程数,玩游戏消耗时间百分比和每周消耗冰激凌的公 ...
- Python3:《机器学习笔记与实战》之Knn算法(2)识别手写数字
Python3:<机器学习笔记与实战>之Knn算法(2)识别手写数字 转载请注明作者和出处:https://blog.csdn.net/weixin_41858342/article/de ...
- 机器学习实战之k-近邻算法识别手写数字(含拍照检验步骤详解)
哈哈,这是我写的第一篇博客,就此拉开了我的程序员生涯的序幕.希望有缘人看见之后,能够解决你所遇见的问题.废话不多说,开始办正事. 本例中使用K-近邻算法识别手写数字,参考书目:Peter Harrin ...
- OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字
OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...
- 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)
文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...
- svm手写数字识别_KNN 算法实战篇如何识别手写数字
上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...
- OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字
OpenCV-Python实战(番外篇)--利用 SVM 算法识别手写数字 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 相关链接 前言 支持向量机 ( ...
- 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)
Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...
- Python徒手实现识别手写数字—图像识别算法(K最近邻)
Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...
最新文章
- 主定理(master theorem)学习小记
- 解惑小微企业信息化系统上云的顾虑
- git版本管理工具学习
- UpdatePanel 属性学习之 UpdateMode
- 字体编辑器_三款好用的字体编辑器分享,让您拥有属于自己的字体
- android room_Android Room –待办事项清单应用程序
- 同步计数 Java_Java之同步计数器CyclicBarrier
- Atiitt 使用java语言编写sql函数或存储过程
- 虚幻引擎5 C++游戏开发教程
- 汇编:Mac系统搭建DOSBox汇编环境
- 题解 P4480 【[BJWC2018]餐巾计划问题】
- 怎么把mov格式的视频转换成mp4?
- Android中@GuardedBy
- vue3组件库-mycom3-vue 组件文档
- 服务器安装系统路径,裸金属服务器安装多路径软件
- maven java版本过低_maven项目编译运行时提示jdk版本过低问题解决方法
- PHP 验证码无法显示的问题
- 【重磅来袭】这绝对是全网最全的Springboot面试题
- 时间间隔频率计数器及其主要参数
- yii2教程-登录与自动登录机制解析