摘要:基于K-近邻算法研究手写数字(0-9)的识别问题,本文通过对手写数字的图像进行处理,提取特征向量,使用Python实现了K-近邻算法,并在此基础上开发了一个GUI测试程序,不仅能够实时测试手写识别的结果和调整k值,而且能够对识别错误的数字进行更正,将其加入训练库,使得该程序具有持续的学习能力,不断提高识别精度。

1.引言

K-近邻算法是数据分类中最简单有效的算法。通过计算未知样本与已知样本之间的距离,找出离未知样本最近的已知样本,并将该样本的类别赋予未知样本,即实现了对未知样本的分类。其中,样本之间的距离是通过对样本的特征向量进行计算得出的,每个样本在特征空间中是一个点,则只需在特征空间中计算的两点距离就能计算出两个样本之间的距离,距离越小,则说明两个样本之间越相似。在选择最近样本时,如果选择的不止一个,例如k个,则称为k-近邻,此时未知样本分类的准则为:在k个最近的样本中,将出现次数最多的样本所属的类别赋予未知样本,即完成未知样本的分类。

在本文中,首先使用python实现了一个k-近邻算法,能够对任意的样本进行k-近邻分类。然后研究了图像特征参数的提取,即从每副图像中提取特征向量用于分类算法。使用该方法对大量的样本进行研究,研究不同k值情况下的分类精度问题,最后使用该算法实现一个手写数字识别演示软件。

2.K-近邻算法实现

K-近邻算法实现较为简单,其主要过程如下:

1)计算已知类别数据集中的点与当前点之间的距离;

2)按距离递增次数排序;

3)选取与当前点距离最小的k个点;

4)确定当前k个点所在的类别的出现频率;

5)返回前k个点中出现频率最高的点所属的类作为当前点的预测分类。

Python代码实现如下(使用python下的科学计算库numpy):

def knn_classify(inX,dataSet,labels,k):'''knn算法inX 待分类向量dataSet 训练样本labels 标签向量k 最邻近元素的个数'''dataSetSize = dataSet.shape[0]  #numpy用法 获取训练样本数据的维度大小diffMat = tile(inX,(dataSetSize,1))-dataSet #将inX扩展为跟dataSet维数相同进行相减sqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)distances = sqDistances**0.5       #上三步用于计算欧式距离sortedDistIndicies = distances.argsort()  #按Distance从小到大排序 此处记录的是下标classCount={}for i in range(k):   #取前k个votelabel=labels[sortedDistIndicies[i]]classCount[votelabel]=classCount.get(votelabel,0)+1  #记录每个类别在最近的k个中出现了几个  例如 dict: {'A': 1, 'B': 2}sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)#按 value字段排列字典 return sortedClassCount[0][0]  #返回所属类别

3.图像特征向量提取

为了将图像能够表示成特征向量,首先需要对0-9这10个数字的图像进行二值化,背景值为10,并且统一大小,在此处使用32×32像素,最后将该图像保存成txt格式方便调用。下图给出了两个例子:

  

图1 图像二值化后生产的txt文档格式

由于二值化后的图像仍然是二维数组的形式,因此考虑将其转化为一维形式,即1*1024维的数组,每个像素的值就是1024维特征空间的一个坐标轴的值,这样一幅图像就能够表示成特征空间中的点,而k-近邻分类算法就是要对这些点的距离进行计算。

4.手写识别软件的实现

在K-近邻算法的基础上,本文实现了一个带有GUI界面的程序,能够通过鼠标进行绘制数字,然后通过训练样本进行识别。

GUI程序使用Python库wxPython编写,并且通过pyinstaller进行编译,将py脚本文件编译成exe可执行文件,在没有安装python的计算机上也能够执行。UI界面如下:

图2  手写识别GUI界面

图2中的红色部分是绘制数字的区域,通过鼠标进行绘制,数字大小最好能够填满整个红色部分。

【清空】表示对红色部分进行清空;

【识别】表示对绘制的数字进行识别,识别的结果会写在按钮下边的长文本框中;

【最邻近点个数】即k值,表示在选择最近点时,选择多少个进行位置样本的分类决策’

【输入正确的值并更正】表示当识别错误时,可以选择输入一个正确的值,然后点击更正,将该样本加入训练库中,表示软件对手写的学习,在下一次识别过程中能够提高识别精度。

使用例子:例如,在红色区域绘制一个3后,通过点击识别,即能够将识别结果写在按钮下边的文本框中;若本来绘制的是5,而被错误地识别为3,则可通过在【输入正确的值并更正】处填上5,并点击更正按钮,则该结果会作为正确的分类进入训练样本库中。

 

图3 使用举例

软件识别过程中通过对鼠标在红色画布上的移动,记录鼠标的坐标信息,并将其所到之处及周围(线宽)像素设置为1,即完成了测试样本的处理。获取测试样本之后,将该样本与训练样本进行比较,使用k-近邻算法,找出该样本的分类,最后输出该样本的分类结果。

总结:

分类精度评价来看,k近邻分类分类效果总体还是比较好的,正确率能够到98%以上,但是,运用于实际场景中,由于未知样本变化太多,不确定性太强,很多时候效果并不令人满意。

代码链接:

手写数字识别Python代码

基于K-近邻算法的手写数字识别研究相关推荐

  1. k近邻算法_图穷匕见:K近邻算法与手写数字识别

    机器学习算法是从数据中产生模型,也就是进行学习的算法.我们把经验提供给算法,它就能够根据经验数据产生模型.在面对新的情况时,模型就会为我们提供判断(预测)结果.例如,我们根据"个子高.腿长. ...

  2. 基于K近邻法的手写数字图像识别

                           数字图像处理课程论文                          题目:数字图像识别   摘要 模式识别(PatternRecognition)是一 ...

  3. k-近邻算法实现手写数字识别系统

    k-近邻算法实现手写数字识别系统 一.实验介绍 1.1 实验内容 本实验将会从电影题材分类的例子入手,详细讲述k-近邻算法的原理.在这之后,我们将会使用该算法实现手写数字识别系统. 1.2 课程来源 ...

  4. kNN算法实现手写数字识别(机器学习)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.实验步骤 二.实验过程 1.收集数据:提供文本文件 2.准备数据:将图像转换为测试向量 3.测试算法:使用k-近邻 ...

  5. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

  6. 基于随机梯度下降法的手写数字识别、epoch是什么、python实现

    基于随机梯度下降法的手写数字识别.epoch是什么.python实现 一.普通的随机梯度下降法的手写数字识别 1.1 学习流程 1.2 二层神经网络类 1.3 使用MNIST数据集进行学习 注:关于什 ...

  7. OpenCV4学习笔记(55)——基于KNN最近邻算法实现鼠标手写数字识别

    在上一篇博客<OpenCV4学习笔记(54)>中,整理了关于KNN最近邻算法的一些相关内容和一个手写体数字识别的例子.但是上次所实现的手写体数字识别,每次只能固定地输入测试图像进行预测,而 ...

  8. 机器学习入门-kNN算法实现手写数字识别

    实验环境 Python:3.7.0 Anconda:3-5.3.1 64位 操作系统:win10 开发工具:sublime text(非必要) 简介 本次实验中的重点为采用kNN算法进行手写数字识别, ...

  9. 基于Python的KNN实验手写数字识别

    资源下载地址:https://download.csdn.net/download/sheziqiong/86791480 资源下载地址:https://download.csdn.net/downl ...

  10. 基于matlab BP神经网络的手写数字识别

    摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入.灰度化以及二值化等处理,通过神 ...

最新文章

  1. MicroPython支持图形化编辑了:Python Editor带你轻松玩转MicroPython
  2. 揭秘下一代云数据库引擎MyBasefor PostgreSQL
  3. SAP Spartacus 电商云 UI Shipping Method 在单元测试环境下没有显示的问题
  4. TensorFlow:实战Google深度学习框架(三)深层神经网络
  5. Hibernate查询之Criteria查询
  6. 关于axios请求报400如何获取报错信息
  7. Android Bluetooth BLE相关开发资源汇总
  8. HDU 6180 2017 多校训练:Schedule
  9. 服务器动态上下线监听案例
  10. python引入pytesseract报错:ValueError: Attempted relative import in non-package
  11. 手眼标定,我的结果显示手和眼相距上千米!手眼标定结果准确率如何提高?
  12. Visio2019异步消息箭头线使用问题
  13. uplink Tx switching for ENDC/CA
  14. QQ表情的发送与接收
  15. 405 (Method Not Allowed)
  16. 对象到底是怎么new出来的
  17. Python一键生成纯色图片
  18. TOFEL托福经验贴
  19. 恒生指数、国企指数以及红筹股指数
  20. GB28181实现摄像头网页无插件直播、回放过程中设备状态分析

热门文章

  1. 英语面试自我介绍范文(二)
  2. python转二进制_python转二进制
  3. linux工作区切换到桌面,linux切换桌面环境 gnome kde
  4. 马云卸任演讲全文:青山不改 绿水长流 后会有期
  5. Keil出现出现File “C:\Users\????\AppData\Local\Temp\pxxx-2报错
  6. 探索智慧医院落地新方案!OFweek 2019医疗物联网大会成功举办
  7. 即时通信软件实现原理
  8. Chapter 1 贝叶斯推断的思想
  9. 《货币金融学》米什金版思维导图
  10. 使用均匀分布验证中心极限定理)