哈哈,这是我写的第一篇博客,就此拉开了我的程序员生涯的序幕。希望有缘人看见之后,能够解决你所遇见的问题。废话不多说,开始办正事。

本例中使用K-近邻算法识别手写数字,参考书目:Peter Harrington 的<机器学习实战(中文版)>。本文主要是使用书中已经构建好的算法,来解决实际问题

训练集采用文件 ‘trainingDigits’ 中的2000个样本,都为txt文件格式,每个数字大约含有200个样本,每个样本都为32行*32列。打开其中任意一个文件‘2_33.txt’,如下图所示:

可以明显的看见数字2。且有字体部分为1,空白部分为0。接下来,在纸上随便写一个数字,我写的是数字2,并用手机拍照:

用手机自行剪裁的小一点。

之后,用Photoshop(PS)处理,把图像剪裁成32 * 32像素的的图像。
步骤是:
1.在ps中打开该图像
2.点击上方的‘图像’——>‘图像大小’——>修改图像大小栏中的‘宽度(W)’与‘高度(H)’,再点击确定
就得到了32 * 32像素的的图像。
3.点击‘文件’——>‘储存为’,把当前图像储存好。如下图:

再把此时的图像(命名为‘1.png’)用MATLAB处理,得到test_myself.txt文件,注意应该把该图像导入matlab的当前文件中,否则会显示找不到该文件。

MATLAB代码如下:

i=imread('1.png');
i1=rgb2gray(i);     %i1灰度图像
i2=im2bw(i1);       % i2是二值图,不需要求阈值。但是i2中黑色部分为0,白色部分为1,与 ’2_33.txt‘ 中刚好相反,因此需要倒转
for j=1:32          %把二值化后的矩阵中0变成1,1变成0for k=1:32if i2(j,k)==0i2(j,k)=1elsei2(j,k)=0endend
end
fid=fopen('test_myself.txt','wt');      %写的方式打开文件(若不存在,建立文件);
fprintf(fid,'%d',i2');                  %d 表示以整数形式写入数据,注意:此时i2是转置的
fclose(fid);                            %关闭文件

如果,i2不转置,则得到的txt文件如下:

注意,此时test_myself.txt文本中,只有一行,即含有1*1024个字符,而不是32行 * 32列。需要修改书中的img2vector()与handwritingClassTest()函数,分别修改为img_myself()与handwritingPerson()函数。

所用到的Python代码及其解释如下:

from numpy import *
import operator
from os import listdirdef classify0(inX, dataSet, labels, k):   #对于该函数的解释,见后面图中dataSetSize = dataSet.shape[0]diffMat = tile(inX, (dataSetSize,1)) - dataSetsqDiffMat = diffMat**2sqDistances = sqDiffMat.sum(axis=1)  #every hang add togetherdistances = sqDistances**0.5sortedDistIndicies = distances.argsort()classCount={}          for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]def img2vector(filename):          #该函数是针对文本中为32行*32列进行的处理函数,返回一个1*1024的数组returnVect = zeros((1,1024))fr = open(filename)for i in range(32):lineStr = fr.readline()    #读取一行,即32个字符for j in range(32):returnVect[0,32*i+j] = int(lineStr[j])return returnVect##
def img_myself(filename):         #该函数是针对文本中为1*1024进行的处理函数,返回一个1*1024的数组returnVect=zeros((1,1024))fr=open(filename)lineStr=fr.readline()         #读取一行,即1*1024个字符for i in range(1024):returnVect[0,i]=int(lineStr[i])return returnVectdef handwritingPerson(filename):  #filename为待测试的txt文件,本例中为'test_myself.txt'文件hwLabels = []trainingFileList = listdir('trainingDigits')  #储存训练集'trainingDigits'文件夹中所有的文件名到列表trainingFileList中m = len(trainingFileList)trainingMat = zeros((m, 1024))                #每行储存一个图像for i in range(m):fileNameStr = trainingFileList[i]         #第i个文件的文件名储存在fileNameStr中,如‘0_0.txt’fileStr = fileNameStr.split('.')[0]       #把文件名用‘.’分开成两部分,取第一部分,如把‘0_0.txt’分开成‘0_0’与‘txt’两部分,0代表取前一部分classNumStr = int(fileStr.split('_')[0])  #同理,取‘0_0’中前一部分0,并转换为int类型hwLabels.append(classNumStr)              #训练集的标签矩阵trainingMat[i, :] = img2vector('trainingDigits/%s' % fileNameStr)   #打开trainingDigits文件夹下的文件,读取并转化为1*1024的矩阵后,添加到trainingMat的对应行中,组成训练集的矩阵test_myself=img_myself(filename)              #读取filename文件并转化为1*1024的矩阵,组成测试集test_myself_label=classify0(test_myself,trainingMat,hwLabels,5)   #进行训练并测试,把结果放到test_myself_label中print("The test_myself_label is ",test_myself_label)

classify0()函数的解释如下图:

最后检验识别效果:

handwritingPerson('test_myself.txt')

大约运行5秒,得到运行结果:

识别正确!

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

  1. K 近邻算法识别手写数字(Numpy写法)

    在 Kaggle 上面的 Notebook 给可爱的学弟学妹们用于参考... 代码这个东西一定要自己多写,我一边听着林宥嘉的<想自由>,一边写出了大致的实现.K 近邻算法大概做的是一件什么 ...

  2. 四、用简单神经网络识别手写数字(内含代码详解及订正)

    本博客主要内容为图书<神经网络与深度学习>和National Taiwan University (NTU)林轩田老师的<Machine Learning>的学习笔记,因此在全 ...

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

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

  4. 【机器学习实战】k近邻算法实战——手写识别系统

    文章目录 手写识别系统 步骤: 准备数据:将图像转换为测试向量 测试算法:使用k-近邻算法识别手写数字 [完整代码] 手写识别系统 为了简单起见,这里构造的系统只能识别数字0到9,参见图2-6.需要识 ...

  5. 机器学习实战之K近邻算法

    k近邻算法概述 简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类. 优 点 :精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. ...

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

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

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

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

  8. python与人工智能:KNN近邻法识别手写数字

    机器学习分类? 1 特征(feature) 数据是区分事物和事物的关键. 举例:不同类型的书,我们用书的内容来对它进行分类 2 标签(label) 数据的标签,显示的分类结果. 举例:书属于的类别,例 ...

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

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

最新文章

  1. 别了比特币,BCH将领导加密货币!
  2. 什么是正确的JSON内容类型?
  3. 802.11帧聚合技术
  4. Oracle11g 备份和恢复的方法
  5. Spark RDD Cache Checkpoint
  6. dev代码拷贝中文乱码的解决方案
  7. Mysql 时间类型整理
  8. java控制浏览器,java控制夜神访问浏览器
  9. RGBA 图片格式转换 RGB 无损
  10. matlab画图常用函数image、imagesc、imshow区别
  11. 正则表达式匹配中文时发现的问题
  12. 82、组合分配式气体灭火系统所需的气体单向阀的数量
  13. 2021-01-12
  14. SpringBoot替换jar包中引用的jar包(Unable to open nested entry ‘BOOT-INF/lib/**.jar‘. It has been compressed)
  15. ssm毕设项目磐基建筑机械租赁有限公司机械租赁系统41c32(java+VUE+Mybatis+Maven+Mysql+sprnig)
  16. svn: E175003:The server at ‘https://XXX/!/#XXX/XXX‘ does not support the HTTP/DAV protocol解决方案
  17. 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式
  18. echart折线图信息配置及点击事件
  19. 人生苦短,必须性感!
  20. delphi 文件夹操作

热门文章

  1. python实现从网站XKCD下载全部漫画
  2. 量产直流无刷电机驱动器资料
  3. 高德地图联手达摩院推车载AR导航,百度地图这次彻底赶不上了!
  4. 二维码生成工具V1.0
  5. 广电宽带 拨号失败 服务器无响应,广电宽带无法打开FTP,该如何排除问题 ?
  6. stanford open-source CFD code SU2-3.2.9 源码编译安装
  7. 论文翻译——一种用于产品生命周期管理的产品信息建模框架
  8. SDN and OpenFlow扫盲
  9. 支付宝小程序 使用uView实现省市区三级联动的坑
  10. 物联网时代下的三巨头:美的的势、格力的专、海尔的局