机器学习实战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-近邻算法例子-识别手写数字相关推荐

  1. 机器学习实战第二章K近邻算法照葫芦画瓢实践。

    分别实现了最基本的3个DEMO 1.给你若干个带有标签的二维点作为训练集,给定一系列的二维随机点,看其通过训练集,可以被分为哪一类 2.给你N个人的飞行里程数,玩游戏消耗时间百分比和每周消耗冰激凌的公 ...

  2. Python3:《机器学习笔记与实战》之Knn算法(2)识别手写数字

    Python3:<机器学习笔记与实战>之Knn算法(2)识别手写数字 转载请注明作者和出处:https://blog.csdn.net/weixin_41858342/article/de ...

  3. 机器学习实战之k-近邻算法识别手写数字(含拍照检验步骤详解)

    哈哈,这是我写的第一篇博客,就此拉开了我的程序员生涯的序幕.希望有缘人看见之后,能够解决你所遇见的问题.废话不多说,开始办正事. 本例中使用K-近邻算法识别手写数字,参考书目:Peter Harrin ...

  4. OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...

  5. 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)

    文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...

  6. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  7. OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字

    OpenCV-Python实战(番外篇)--利用 SVM 算法识别手写数字 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 相关链接 前言 支持向量机 ( ...

  8. 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)

    Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...

  9. Python徒手实现识别手写数字—图像识别算法(K最近邻)

    Python徒手实现识别手写数字-图像识别算法(K最近邻) 写在前面 这一段的内容可以说是最难的一部分之一了,因为是识别图像,所以涉及到的算法会相比之前的来说比较困难,所以我尽量会讲得清楚一点. 而且 ...

最新文章

  1. 主定理(master theorem)学习小记
  2. 解惑小微企业信息化系统上云的顾虑
  3. git版本管理工具学习
  4. UpdatePanel 属性学习之 UpdateMode
  5. 字体编辑器_三款好用的字体编辑器分享,让您拥有属于自己的字体
  6. android room_Android Room –待办事项清单应用程序
  7. 同步计数 Java_Java之同步计数器CyclicBarrier
  8. Atiitt 使用java语言编写sql函数或存储过程
  9. 虚幻引擎5 C++游戏开发教程
  10. 汇编:Mac系统搭建DOSBox汇编环境
  11. 题解 P4480 【[BJWC2018]餐巾计划问题】
  12. 怎么把mov格式的视频转换成mp4?
  13. Android中@GuardedBy
  14. vue3组件库-mycom3-vue 组件文档
  15. 服务器安装系统路径,裸金属服务器安装多路径软件
  16. maven java版本过低_maven项目编译运行时提示jdk版本过低问题解决方法
  17. PHP 验证码无法显示的问题
  18. 【重磅来袭】这绝对是全网最全的Springboot面试题
  19. 时间间隔频率计数器及其主要参数
  20. yii2教程-登录与自动登录机制解析

热门文章

  1. BaseQuickAdapter万能适配器
  2. 一粒云磁盘扩容和组建raid
  3. android ----- 服务器返回的14种常见HTTP状态码
  4. 如何打印CSDN博客?将CSDN博客内容保存为PDF然后下载
  5. Qt网络编程-TcpServer入门Demo(2)
  6. matplotlib.pyplot contourf()函数的使用
  7. 天啊,绕过我吧,不要卷了
  8. Linux发行版的组成
  9. linux 关闭非法端口的多种方法 例如 111,135,137端口
  10. Python忽略警告ignore warning