看完一节《机器学习实战》,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别

kNN

 先简单介绍一下kNN,就是所谓的K-近邻算法:

  【作用原理】:存在一个样本数据集合、每个样本数据都存在标签。输入没有标签的新数据后,将新数据的每个特征与样本集数据的对应特征进行比较,然后算法提取样本集中最相似的分类标签。一般说来,我们只选择样本数据集中前k个最相似的数据,最后,选择这k个相似数据中出现次数最多的分类,作为新数据的分类。

  通俗的说,举例说明:有一群明确国籍的人(样本集合,比如1000个):中国人、韩国人、日本人、美国人、埃及人,现在有一个不知国籍的人,想要通过比较特征来猜测他的国籍(当然,特征具有可比较性和有效性),通过比较特征,得出特征与该人最相近的样本集中的9个人(k),其中,1个是韩国人、2个是日本人,6个是中国人,那么这个人是中国人的可能性就很大。

  这就是kNN的基本思想。

手写体识别数据准备

  kNN输入需要特征矩阵,一般是固定大小的二值图像,这里我们使用书上提供的数据集:这个数据集使用32X32文本文件存储数值图像。例如下图的'9'

  这里每个文本文件存储一个手写体数据,并且文件名写成"number_num.txt"这样的形式,例如9_1.txt,方便后期提取标签

  我们将样本数据放在trainingDigits文件夹中,测试样例存储在testDigits文件夹中

  我们在处理时将每个手写体数据(32x32)转换成1X1024维的向量。

  另外,kNN涉及到相似度计算。这里我们使用的是欧氏距离,由于手写体数据向量是规则的二值数据,因此不需要进行归一化。

手写体识别算法运行流程

  (一)读取手写体txt文件,转化为1X1024向量

    我们创建一个kNN.py,添加模块img2vector

1 #识别手写字体模块-图像转向量32x32 to 1x1024
2 def img2vector(filename):
3     returnVect = zeros((1,1024))
4     fr = open(filename)
5     for i in range(32):
6         lineStr = fr.readline()
7         for j in range(32):
8             returnVect[0,32*i+j] = int(lineStr[j])
9     return returnVect

    我们的样本数据和测试数据都需要用到该函数

  (二)比较测试数据和样本数据集的距离,返回k近邻中最相似的标签

    在kNN.py中添加classify0模块,附上代码注释  

 1 #---------------------------------------------
 2 #分类模块
 3 #@params
 4 #   inX:输入向量、手写体识别的测试向量
 5 #    dataSet:训练集样本、手写体识别的训练集向量
 6 #    labels:训练集对应的标签向量
 7 #    k:最近邻居数目、本实验为3
 8 #---------------------------------------------
 9 def classifiy0(inX, dataSet, labels, k):
10     dataSetSize = dataSet.shape[0]     #手写体样本集容量
11     #(以下三行)距离计算
12     diffMat = tile(inX, (dataSetSize,1)) - dataSet
13     sqDiffMat = diffMat**2
14     sqDistances = sqDiffMat.sum(axis=1)
15     distances = sqDistances**0.5   #欧氏距离开平方
16     sortedDistIndicies = distances.argsort()  #距离排序的索引排序
17     classCount = {}
18     #(以下两行)选择距离最小的k个点
19     for i in range(k):
20         voteIlabel = labels[sortedDistIndicies[i]]
21         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
22     sortedClassCount = sorted(classCount.items(),
23     #排序
24     key = operator.itemgetter(1), reverse = True)
25     return sortedClassCount[0][0]            

    注意,这里使用了numpy的接口,在kNN.py的开头要加上:from numpy import* 

  (三)比较标签与测试结果,计算正确率

    同样,在kNN.py中添加handwritingClassTest模块,综合以上的两个模块,获得识别正确率

 1 #手写识别的测试代码
 2 def handwritingClassTest():
 3     hwLabels = []
 4     trainingFileList = listdir(path='trainingDigits')  #获取目录内容
 5     m = len(trainingFileList)
 6     trainingMat = zeros((m,1024))
 7     for i in range(m):
 8         #一下三行,从文件名解析分类数字
 9         fileNameStr = trainingFileList[i]
10         fileStr = fileNameStr.split('.')[0]
11         classNumStr = int(fileStr.split('_')[0])
12
13         hwLabels.append(classNumStr)
14         trainingMat[i,:] = img2vector('trainingDigits/%s'%fileNameStr)
15     testFileList = listdir(path='testDigits')
16
17     errorCount = 0.0  #错误个数计数器
18     mTest = len(testFileList)
19
20     #从测试数据中提取数据
21     for i in range(mTest):
22         fileNameStr = testFileList[i]
23         fileStr = fileNameStr.split('.')[0]
24
25         classNumStr = int(fileStr.split('_')[0])
26         vectorUnderTest = img2vector('testDigits/%s'% fileNameStr)
27         classifierResult = classify0(vectorUnderTest, trainingMat, hwLabels, 3)
28
29         print("the classifier came back with:%d,the real answer is:%d"%(classifierResult,classNumStr))
30         if(classifierResult != classNumStr):
31             errorCount += 1.0
32    #输出结果
33     print("\nthe total number of errors is:%d"%errorCount)
34     print("\nthe total error rate is: %f"%(errorCount/float(mTest)))

    注意,这里使用到了os模块listdir,在kNN开头加入:from numpy import listdir

  测试结果如下:

  错误率为1.16%,可以看到,识别效果挺不错。

后记

  通过实验我们可以看到,使用kNN要将训练样本一次性加载入内存、如果训练集的规模很大,势必对机器有很大的要求。另外,kNN不需要训练算法、对异常值不敏感、在后期使用的时候要慎重选择吧

    

 

转载于:https://www.cnblogs.com/HolyShine/p/6358554.html

基于kNN的手写字体识别——《机器学习实战》笔记相关推荐

  1. matlab基于SVM的手写字体识别,机器学习SVM--基于手写字体识别

    每一行代表一个手写字体图像,最大值为16,大小64,然后最后一列为该图片的标签值. import numpy as np from sklearn import svm import matplotl ...

  2. 《MATLAB 神经网络43个案例分析》:第19章 基于SVM的手写字体识别

    <MATLAB 神经网络43个案例分析>:第19章 基于SVM的手写字体识别 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB 神经网络43个案例分析 ...

  3. 计算机视觉ch8 基于LeNet的手写字体识别

    文章目录 原理 LeNet的简单介绍 Minist数据集的特点 Python代码实现 原理 卷积神经网络参考:https://www.cnblogs.com/chensheng-zhou/p/6380 ...

  4. AI基础:KNN与K近邻距离度量说明、利用KNN手写字体识别分类实践

    KNN k近邻 文章目录 KNN算法 K近邻中近邻的距离度量 欧式距离 标准化欧式距离 曼哈顿距离 汉明距离 夹角余弦 杰卡德相似系数 皮尔逊系数 切比雪夫距离 闵可夫斯基距离 马氏距离 巴氏距离 各 ...

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

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

  6. numpy完成手写字体识别(机器学习作业02)

    numpy完成手写字体识别(机器学习02) 参考代码:mnielsen/neural-networks-and-deep-learning: 参考讲解:深度学习多分类任务的损失函数详解 - 知乎 (z ...

  7. 基于Python神经网络的手写字体识别

    本文将分享实现手写字体识别的神经网络实现,代码中有详细注释以及我自己的一些体会,希望能帮助到大家 (≧∇≦)/ ############################################ ...

  8. 深度学习,实现手写字体识别(大数据人工智能公司)

    手写字体识别是指给定一系列的手写字体图片以及对应的标签,构建模型进行学习,目标是对于一张新的手写字体图片能够自动识别出对应的文字或数字.通过深度学习构建普通神经网络和卷积神经网络,处理手写字体数据.通 ...

  9. 第六讲 Keras实现手写字体识别分类

    一 本节课程介绍 1.1 知识点 1.图像识别分类相关介绍: 2.Mnist手写数据集介绍: 3.标准化数据预处理: 4.实验手写字体识别 二 课程内容 2.1 图像识别分类基本介绍 计算机的图像识别 ...

最新文章

  1. Jmeter Web 性能测试入门 (六):Jmeter 解析 response 并传递 value
  2. 【每周CV论文】初学实例分割需要读哪些文章?
  3. 史上最被低估的两个学科!它们远比你想的更重要!
  4. idhttp.post方式 调用datasnap rest 远程方法(转咏南兄)
  5. react如何写ajax,请问如何在React中做Ajax 请求?
  6. PickerView的简单介绍
  7. 《JAVA常用算法手册》学习笔记(一)
  8. Win10删除文件需要管理员权限则怎么办?
  9. Jenkins容器由于虚拟内存不足导致的异常退出
  10. Leetcode237之删除链表中的节点
  11. perl编译器下载linux64,perl 在linux 下的安装
  12. 代码随想录第十八天 LeetCode513、112、113、106、105
  13. (微信定时发送消息)一个java文件,完成可配置的微信定时发送消息任务
  14. 大家好,欢迎您加入这个集体!
  15. HTML基础之 HTML5新增视频和音频标签
  16. 几何分布的期望和方差公式推导_平方差公式证明推导过程及运用详解(数学简便计算方法之一)...
  17. 如何快速理解最大流和最小割
  18. 如何让邮件变的更安全?邮箱安全中心在哪里?
  19. linux安装及配置mycat eye可视化监控界面
  20. 171023—各进制数输出:二进制转换用格式控制符输出八,十,十六进制数

热门文章

  1. 如何用WebIDE打开并运行CRM Fiori应用
  2. SAP ABAP的权限检查跟踪(Authorization trace)工具使用步骤介绍
  3. 从硬盘安装dell服务器,Dell服务器硬盘安装.doc
  4. matlab 函数return_基于MATLAB的指纹识别系统【论文,GUI】
  5. java redis缓存实例_spring项目整合ehcache和redis缓存实例
  6. php session支持,SESSION支持
  7. python定时器5秒执行一次_PLC编程之“自切断”定时器
  8. python引入自己写的文件_python引入自己写的Py文件
  9. python拼图游戏代码的理解_Python加pyGame实现的简单拼图游戏实例
  10. 函数式编程 lambda表达式