手写字识别knn模型

1、实验原理:

Knn算法:邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是机器学习分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。属于监督学习,有类别标记,他没有明显的前期训练过程,在程序运行之后,把数据加载到内存后,不需要进行训练就可以分类。

2、大致流程:

使用kNN算法的手写识别系统

1.收集数据:提供文本文件

2.准备数据:编写函数img2vector(),将图像格式转换为分类器使用的向量格式。

3.分析数据:在Python命令提示符中检查数据,确保它符合要求。

4.测试算法:编写函数使用提供的部分数据集作为测试样本,测试样本与非测试样本的区别在于测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。

5.使用算法:使用已编写好的算法来对测试样本进行测试

3、功能实现:

3.1 数据集的准备

将图像转换为txt文件。已知图像为28*28的像素范围,利用getpixel提取图片中的像素值大小。在打印成txt文件,这边要注意的是这边读取的是整个文件夹。

图 1数据集整理

 

3.2命名的整理

为了更好的对已有的数据集进行分类,我们将正确值与图片转换后的txt进行一一对应。

图 2 标签分离

 

注意:这边我们将列表的0序号占用掉。

将txt的命名修改成 标签_图片的形式,帮助knn进行分类。

 

图 3 txt命名

3.3KNN模型的建立:

实现思路:①将测试数据转换成只有一列的0-1矩阵形式 将所有(L个)训练数据也都用上方法转换成只有一列的0-1矩阵形式。②把L个单列数据存入新矩阵A中——矩阵A每一列存储一个字的所有信息。③用测试数据与矩阵A中的每一列求距离,求得的L个距离存入距离数组中。④从距离数组中取出最小的K个距离所对应的训练集的索引拥有最多索引的值就是预测值。

所以先定义一个读取数据的转换数据的函数。将图像信息转成28*28的格式。

 图 4 读跟转换函数

在定义一个距离计算,相似度比较函数,来得出最高的索引值。用来确定测试样本的属性。

图 5 相似度计算

最后编写识别函数:

 

图 6识别函数

注意:图中定义模型列表,用来保存knn训练时产生的数组。采取的训练好后,将待测的值依次放入,进而求最接近的数,其概率就是最匹配的索引值。

3.4待测数据的整理:

将待训练的5000的样本集进行转换为txt文件。

图 7 待测样本转入

通过观察,可以发现本次实验所给的样本为乱序状态,无法对其用训练集的方式读取,所以这边采用了try ····except 的方式,用来跳过错误的文件名。

3.5、结果输出

图 8输出结果

利用已存入结果的结果列表result1,将对应的结果输出,输出是注意要将原图像的图形名一同输出,考虑到我们在测试的时候读写图片的顺序也是按顺序读写,所以这里输出的时候,我们在定义一个列表,用来存储名称。

图 9 结果

  1. 总结:

1、本次实验主要使用了kNN算法,由于采用的是图片转txt后在对应数组,在数据集达到60000时,运行时间巨长,而且在面对5000个数据集时,因为采用的是1对60000数组的形式,导致配对的数据更加长。这个也是此次程序的设计漏洞所在,但是其准确性确实高。

2、本次实验最难的部分,其实并不是算法的设计,我更认为是完成这些设计的边缘代码。比如如何使用 os 库,如何去遍历文件夹内的图片,以及非顺序性读取文件的处理。总体来说,本次课设不仅让我们学习了knn算法的原理,还巩固了我们其他方面的能力。

3、面对测试时间太长这个问题,经过更改数组变化,利用opencv库进行修改,大幅度提高了测试速度。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值