本文主要是用kNN算法对字母图片进行特征提取,分类识别。内容如下:

kNN算法及相关Python模块介绍

对字母图片进行特征提取

kNN算法实现

kNN算法分析

一、kNN算法介绍

K近邻(kNN,k-NearestNeighbor)分类算法是机器学习算法中最简单的方法之一。所谓K近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。我们将样本分为训练样本和测试样本。对一个测试样本 t  进行分类,kNN的做法是先计算样本 t  到所有训练样本的欧氏距离,然后从中找出k个距离最短的训练样本,用这k个训练样本中出现次数最多的类别表示样本 t 的类别。

欧式距离的计算公式:

假设每个样本有两个特征值,如 A :(a1,b1)B:(a2,b2) 则AB的欧式距离为

举个例子:根据下图前四位同学的成绩和等级,预测第五位小白同学的等级。

我们可以看出:语文和数学成绩是一个学生的特征,等级是一个学生的类别。

前四位同学是训练样本,第五位同学是测试样本。我们现在用kNN算法来预测第五位同学的等级,k取3。

按照上面欧式距离公式我们可以计算

d(5-1)=

= 7          d(5-2)=

= 30

d(5-3)=

= 6          d(5-4)=

= 19.2

因为 k 取 3,所以我们寻找3个距离最近的样本,即编号为3,1,4的同学,他们的等级分别是 B,B,A。 这三个样本的分类中,出现了2次B,一次A,B出现次数最多,所以5号同学的等级可能为B

常用Python模块

NumPy:NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。

PIL:Python Imaging Library,是Python平台事实上的图像处理标准库,功能非常强大,API也简单易用。但PIL包主要针对Python2,不兼容Python3,所以在Python3中使用Pillow,后者是大牛根据PIL移植过来的,两者用法相同。

上面两个Python库都可以通过pip进行安装。

pip3 install [name]

还有就是Python 自带标准库:shutil模块提供了大量的文件的高级操作,特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作。operator模块是Python 的运算符库,os 模块是Python的系统的和操作系统相关的函数库。

二、对图片进行特征提取

1、采集手写字母的图片素材

有许多提供机器学习数据集的网站,如知乎上的整理 https://www.zhihu.com/question/63383992/answer/222718972  我搜集到的手写字母图片资源如下 链接:https://pan.baidu.com/s/1pM329fl  密码:i725   其中by_class.zip 压缩包是已经分类好的图片样本,可以直接下载使用

2、提取图片素材的特征

最简单的做法是将图片转换为由0 和1 组成的txt 文件,如

转换代码如下:

1 importos2 importshutil3 from PIL importImage4

5

6 #image_file_prefix png图片所在的文件夹

7 #file_name png png图片的名字

8 #txt_path_prefix 转换后txt 文件所在的文件夹

9 defgenerate_txt_image(image_file_prefix, file_name, txt_path_prefix):10 """将图片处理成只有0 和 1 的txt 文件"""

11 #将png图片转换成二值图并截取四周多余空白部分

12 image_path =os.path.join(image_file_prefix, file_name)13 #convert('L') 将图片转为灰度图 convert('1') 将图片转为二值图

14 img = Image.open(image_path, 'r').convert('1').crop((32, 32, 96, 96))15 #指定转换后的宽 高

16 width, height = 32, 32

17    img.thumbnail((width, height), Image.ANTIALIAS)

18 #将二值图片转换为0 1,存储到二位数组arr中

19 arr =[]20 for i inrange(width):21 pixels =[]22 for j inrange(height):23 pixel =int(img.getpixel((j, i)))24 pixel = 0 if pixel == 0 else 1

25 pixels.append(pixel)26 arr.append(pixels)27

28 #创建txt文件(mac下使用os.mknod()创建文件需要root权限,这里改用复制的方式)

29 text_image_file = os.path.join(txt_path_prefix, file_name.split('.')[0] + '.txt')30 empty_txt_path = "/Users/beiyan/Downloads/empty.txt"

31 shutil.copyfile(empty_txt_path, text_image_file)32

33 #写入文件

34 with open(text_image_file, 'w') as text_file_object:35 for line inarr:36 for e inline:37 text_file_object.write(str(e))38 text_file_object.write("\n")

将所有素材转换为 txt 后,分为两部分:训练样本 和 测试样本。

三、kNN算法实现

1、将txt文件转为一维数组的方法:

1 defimg2vector(filename, width, height):2 """将txt文件转为一维数组"""

3 return_vector = np.zeros((1, width *height))4 fr =open(filename)5 for i inrange(height):6 line =fr.readline()7 for j inrange(width):8 return_vector[0, height * i + j] =int(line[j])9 return return_vector

2、对测试样本进行kNN分类,返回测试样本的类别:

1 importnumpy as np2 importos3 importoperator4

5

6 #test_set 单个测试样本

7 #train_set 训练样本二维数组

8 #labels 训练样本对应的分类

9 #k k值

10 defclassify(test_set, train_set, labels, k):11 """对测试样本进行kNN分类,返回测试样本的类别"""

12 #获取训练样本条数

13 train_size =train_set.shape[0]14

15 #计算特征值的差值并求平方

16 #tile(A,(m,n)),功能是将数组A行重复m次 列重复n次

17 diff_mat = np.tile(test_set, (train_size, 1)) -train_set18 sq_diff_mat = diff_mat ** 2

19

20 #计算欧式距离 存储到数组 distances

21 sq_distances = sq_diff_mat.sum(axis=1)22 distances = sq_distances ** 0.5

23

24 #按距离由小到大排序对索引进行排序

25 sorted_index =distances.argsort()26

27 #求距离最短k个样本中 出现最多的分类

28 class_count ={}29 for i inrange(k):30 near_label =labels[sorted_index[i]]31 class_count[near_label] = class_count.get(near_label, 0) + 1

32 sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)33 return sorted_class_count[0][0]

3、统计分类错误率

1 #train_data_path 训练样本文件夹

2 #test_data_path 测试样本文件夹

3 #k k个最近邻居

4 defget_error_rate(train_data_path, test_data_path, k):5 """统计识别错误率"""

6 width, height = 32, 32

7 train_labels =[]8

9 training_file_list =os.listdir(train_data_path)10 train_size =len(training_file_list)11

12 #生成全为0的训练集数组

13 train_set = np.zeros((train_size, width *height))14

15 #读取训练样本

16 for i inrange(train_size):17 file =training_file_list[i]18 file_name = file.split('.')[0]19 label = str(file_name.split('_')[0])20 train_labels.append(label)21 train_set[i, :] =img2vector(os.path.join(train_data_path, training_file_list[i]), width, height)22

23 test_file_list =os.listdir(test_data_path)24 #识别错误的个数

25 error_count = 0.0

26 #测试样本的个数

27 test_count =len(test_file_list)28

29 #统计识别错误的个数

30 for i inrange(test_count):31 file =test_file_list[i]32 true_label = file.split('.')[0].split('_')[0]33

34 test_set =img2vector(os.path.join(test_data_path, test_file_list[i]), width, height)35 test_label =classify(test_set, train_set, train_labels, k)36 print(true_label, test_label)37 if test_label !=true_label:38 error_count += 1.0

39 percent = error_count /float(test_count)40 print("识别错误率是:{}".format(str(percent)))

4、测试结果

训练样本:  0-9,a-z,A-Z 共62个字符,每个字符选取120个训练样本 , 一共有7440 个训练样本。每个字符选取20个测试样本,一共1200个测试样本。

尝试改变条件,测得识别正确率如下:

四、kNN算法分析

由上部分结果可知:knn算法对于手写字母的识别率并不理想。

原因可能有以下几个方面:

1、图片特征提取过于简单,图片边缘较多空白,且图片中字母的中心位置未必全部对应

2、因为英文有些字母大小写比较相似,容易识别错误

3、样本规模较小,每个字符最多只有300个训练样本,真正的训练需要海量数据

在后序的文章中尝试用其他学习算法提高分类识别率。各位道友有更好的意见也欢迎提出!

python手写字母识别_机器学习--kNN算法识别手写字母相关推荐

  1. 开根号的笔算算法图解_机器学习KNN算法之手写数字识别

    1.算法简介 手写数字识别是KNN算法一个特别经典的实例,其数据源获取方式有两种,一种是来自MNIST数据集,另一种是从UCI欧文大学机器学习存储库中下载,本文基于后者讲解该例. 基本思想就是利用KN ...

  2. 经典实战案例:用机器学习 KNN 算法实现手写数字识别 | 原力计划

    作者 | 奶糖猫 来源 | CSDN 博客,责编 | 夕颜 头图 | CSDN 下载自视觉中国 出品 | CSDN(ID:CSDNnews) 算法简介 手写数字识别是KNN算法一个特别经典的实例,其数 ...

  3. 安卓dtmf识别_使用Goertzel算法识别DTMF信号

    Goertzel算法 Goertzel算法由Gerald Goertzel在1958年提出,用于数字信号处理,是属于离散傅里叶变换的范畴,目的是从给定的采样中求出某一特定频率信号的能量,用于有效性的评 ...

  4. knn算法测试手写识别系统准确率

    手写识别系统,KNN算法实现手写识别系统的准确率 (准确率=测试分对的样本数/总的样本数) import numpy as np from itertools import chain from os ...

  5. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

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

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

  7. 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)

    机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...

  8. 【Python】基于kNN算法的手写识别系统的实现与分类器测试

    基于kNN算法的手写识别系统 1.      数据准备 使用windows画图工具,手写0-9共10个数字,每个数字写20遍,共200个BMP文件. 方法如下,使用画图工具,打开网格线,调整像素为32 ...

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

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

最新文章

  1. 2021计算机考研计算机组成原理知识结构图
  2. 静态页面中导航切换时的当前状态(四中方法)
  3. Python--读取csv文件的整列
  4. GraphQL的query:一个最简单的例子
  5. 遮罩窗体弹出登录页面代码实现
  6. python如何导入图片imread_OpenCV 使用imread()函数读取图片的六种正确姿势
  7. 我的Go+语言初体验——(3)Go+ 语言数据类型
  8. 使用siege对varnish进行压测对比
  9. SQL SERVER 2008的错误日志太大
  10. SPHINX安装步骤
  11. linux7.0 端口占用,Windows 7如何处理 80端口被占用
  12. py 生产csv文件_数据处理技巧 | glob 被忽略的超强文件批量处理模块
  13. 虚拟机命令里面的光标不动了怎么办_Linux Sever简单笔记(第四堂课)之Linux下的文本编辑器vim(vim中常用的操作方式命令) - 我杨晓东太难了...
  14. Incapsula CDN 入门指南
  15. 双料大奖 | 奇点云获评「年度数字化创新最佳实践奖」「年度数字化服务最值得信赖品牌奖」
  16. ftp木马病毒photo.scr,Video.scr,AV.scr文件处理方法(windows服务器)
  17. 解决file_get_contents乱码
  18. 如何快速学习一门新技术
  19. Pandas库的学习
  20. 复盘:一份完整的活动运营策划方案是这样的

热门文章

  1. Vue + elementui +router+swiper的几个不走弯路小技巧
  2. 计算机用电,37℃,37℃,37℃……超长高温天气下,这些家庭安全用电知识你要知道!...
  3. 2012年吉林省联通远程数据复制软件采购
  4. AAMVA标准磁条卡泰国车载读卡器|刷卡机MSR100-D1-3性能与应用领域
  5. 【毕业设计】机器视觉火车票识别系统 - python 深度学习
  6. mysql truncated_奇怪,向mysql插入数据部分会出现Data truncated for column 错误
  7. 几点需要注意选择APP开发外包团队的注意事项
  8. vs2010 c++连接mysql_vs2010c++链接mysql
  9. 实验4:Zigbee使用非易失性存储器来存储自定义数据 - 新兵训练营(6)
  10. 网络安全培训入门之0基础学网络安全要学哪些内容?