机器学习实战之k-近邻算法识别手写数字(含拍照检验步骤详解)
哈哈,这是我写的第一篇博客,就此拉开了我的程序员生涯的序幕。希望有缘人看见之后,能够解决你所遇见的问题。废话不多说,开始办正事。
本例中使用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-近邻算法识别手写数字(含拍照检验步骤详解)相关推荐
- K 近邻算法识别手写数字(Numpy写法)
在 Kaggle 上面的 Notebook 给可爱的学弟学妹们用于参考... 代码这个东西一定要自己多写,我一边听着林宥嘉的<想自由>,一边写出了大致的实现.K 近邻算法大概做的是一件什么 ...
- 四、用简单神经网络识别手写数字(内含代码详解及订正)
本博客主要内容为图书<神经网络与深度学习>和National Taiwan University (NTU)林轩田老师的<Machine Learning>的学习笔记,因此在全 ...
- k近邻算法_图穷匕见:K近邻算法与手写数字识别
机器学习算法是从数据中产生模型,也就是进行学习的算法.我们把经验提供给算法,它就能够根据经验数据产生模型.在面对新的情况时,模型就会为我们提供判断(预测)结果.例如,我们根据"个子高.腿长. ...
- 【机器学习实战】k近邻算法实战——手写识别系统
文章目录 手写识别系统 步骤: 准备数据:将图像转换为测试向量 测试算法:使用k-近邻算法识别手写数字 [完整代码] 手写识别系统 为了简单起见,这里构造的系统只能识别数字0到9,参见图2-6.需要识 ...
- 机器学习实战之K近邻算法
k近邻算法概述 简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类. 优 点 :精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. ...
- OpenCV-Python实战(番外篇)——利用 KNN 算法识别手写数字
OpenCV-Python实战(番外篇)--利用 KNN 算法识别手写数字 前言 手写数字数据集 MNIST 介绍 基准模型--利用 KNN 算法识别手写数字 改进模型1--参数 K 对识别手写数字精 ...
- OpenCV-Python实战(番外篇)——利用 SVM 算法识别手写数字
OpenCV-Python实战(番外篇)--利用 SVM 算法识别手写数字 前言 使用 SVM 进行手写数字识别 参数 C 和 γ 对识别手写数字精确度的影响 完整代码 相关链接 前言 支持向量机 ( ...
- python与人工智能:KNN近邻法识别手写数字
机器学习分类? 1 特征(feature) 数据是区分事物和事物的关键. 举例:不同类型的书,我们用书的内容来对它进行分类 2 标签(label) 数据的标签,显示的分类结果. 举例:书属于的类别,例 ...
- 基于K近邻法的手写数字图像识别
数字图像处理课程论文 题目:数字图像识别 摘要 模式识别(PatternRecognition)是一 ...
最新文章
- 别了比特币,BCH将领导加密货币!
- 什么是正确的JSON内容类型?
- 802.11帧聚合技术
- Oracle11g 备份和恢复的方法
- Spark RDD Cache Checkpoint
- dev代码拷贝中文乱码的解决方案
- Mysql 时间类型整理
- java控制浏览器,java控制夜神访问浏览器
- RGBA 图片格式转换 RGB 无损
- matlab画图常用函数image、imagesc、imshow区别
- 正则表达式匹配中文时发现的问题
- 82、组合分配式气体灭火系统所需的气体单向阀的数量
- 2021-01-12
- SpringBoot替换jar包中引用的jar包(Unable to open nested entry ‘BOOT-INF/lib/**.jar‘. It has been compressed)
- ssm毕设项目磐基建筑机械租赁有限公司机械租赁系统41c32(java+VUE+Mybatis+Maven+Mysql+sprnig)
- svn: E175003:The server at ‘https://XXX/!/#XXX/XXX‘ does not support the HTTP/DAV protocol解决方案
- 程序员开发什么小程序挣钱_作为程序员赚钱的5种独特方式
- echart折线图信息配置及点击事件
- 人生苦短,必须性感!
- delphi 文件夹操作