使用kNN算法实现简单的手写文字识别

0. 介绍

kNN,即k-Nearest Neighbor(k近邻算法), 简介可参考KNN的一些总结. 本文是《机器学习实战》一书第二章的例子, 主要利用kNN实现简单的手写文字识别.

书中使用Python实现, 本文是使用R语言. 数据集中的图片分辨率为32*32, 并且该数据已经预处理成文本文件, 即类似点阵字体, 使用1代表有文字的像素, 0表示空白.

1. kNN算法实现

算法的步骤主要有:

  1. 计算测试数据到所有训练数据的距离

  2. 对1中计算的距离排序, 选出最小的k个训练数据

  3. 在2中选出的k个数据中选取出现几率最大的标签, 此即算法对测试数据的分类

排序的时候, 利用的是order方法, 取出降序排序元素的索引, 这在numpy中对应的方法是argsort.

实现代码如下:

classify0

2. 准备数据

本次实践准备的数据在两个文件目录中,

  1. trainingDigits -- 包含2000个例子, 每个数字大概200个.

  2. testDigits -- 包含大约900个例子.

trainingDigits中的数据将用于训练分类器, testDigits中的数据将用于测试分类器的效果.

由于原始数据是3232的矩阵, 现在需要将其转化为11024的向量. 程序如下:

img2vector

3. 测试算法

主要的任务是从数据文件中提取所有的用例, 然后调用上面所述的classify0和img2vector函数实现识别工作, 并计算错误率以供参考.

图像文本文件的命名格式为"a_b.txt", a表示当前文件的数字, b表示这是该数字的第b个例子. R对于文本的处理是比较弱的, 不过对于这点内容还是能应付, 使用了一点正则替换搞定.

处理完数据调用核心的classify0函数即可. 具体代码如下:

hardwritingTest

4. 小结

kNN算法的分类思路是很简单的, 实现起来也很方便. 在对数据集测试的时候, 错误率在1.27%, 这个结果还是比较不错的.

不足之处是这种即时训练消耗了过多的时间和空间, 时间主要消耗在读取文件建立数据集和计算距离的时候. 在实际过程中, 前者可以缓存数据, 达到一次读取多次使用; 后者便很难优化了, 这其中涉及到了高阶矩阵的运算, 开销较大. 因此该算法在大规模数据时不宜采用.

关键字:机器学习, r

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部