机器学习算法是从数据中产生模型,也就是进行学习的算法。我们把经验提供给算法,它就能够根据经验数据产生模型。在面对新的情况时,模型就会为我们提供判断(预测)结果。例如,我们根据“个子高、腿长、体重轻”判断一个孩子是个运动员的好苗子。把这些数据量化后交给计算机,它就会据此产生模型,在面对新情况时(判断另一个孩子能不能成为运动员),模型就会给出相应的判断。

比如,要对一组孩子进行测试,首先就要获取这组孩子的基本数据。这组数据包含身高、腿长、体重等数据,这些反映对象(也可以是事件)在某个方面的表现或者性质的事项,被称为属性或特征。而具体的值,如反映身高的“188 cm”就是特征值或属性值。这组数据的集合“(身高=188 cm,腿长=56 cm,体重=46 kg),……,(身高=189 cm,腿长=55 cm,体重=48 kg)”,称为数据集,其中每个孩子的数据称为一个样本。

从数据中学得模型的过程称为学习(learning)或者训练(training)。在训练过程中所使用的数据称为训练数据,其中的每个样本称为训练样本,训练样本所组成的集合称为训练集。

当然,如果希望获取一个模型,除了有数据,还需要给样本贴上对应的标签(label)。例如,“((个子高、腿长、体重轻),好苗子)”。这里的“好苗子”就是标签,通常我们将拥有了标签的样本称为“样例”。

学得模型后,为了测试模型的效果,还要对其进行测试,被测试的样本称为测试样本。输入测试样本时,并不提供测试样本的标签(目标类别),而是由模型决定样本的标签(属于哪个类别)。比较测试样本预测的标签与实际样本标签之间的差别,就可以计算出模型的精确度。

大多数的机器学习算法都来源于日常生活实践。K近邻算法是最简单的机器学习算法之一,主要用于将对象划分到已知类中,在生活中被广泛使用。例如,教练要选拔一批长跑运动员,如何选拔呢?他使用的可能就是K近邻算法,会选择个子高、腿长、体重轻,膝、踝关节围度小,跟腱明显,足弓较大者作为候选人。他会觉得这样的孩子有运动员的潜质,或者说这些孩子的特征和运动员的特征很接近。

理论基础

K近邻算法的本质是将指定对象根据已知特征值分类。例如,看到一对父子,一般情况下,通过判断他们的年龄,能够马上分辨出哪位是父亲,哪位是儿子。这是通过年龄属性的特征值来划分的。

上述例子是最简单的根据单个特征维度做的分类,在实际场景中,情况可能更复杂,有多个特征维度。例如,为一段运动视频分类,判断这段视频是乒乓球比赛还是足球比赛。

为了确定分类,需要定义特征。这里定义两个特征,一个是运动员“挥手”的动作,另一个是运动员“踢脚”的动作。当然,我们不能一看到“挥手”动作就将视频归类为“乒乓球比赛”,因为我们知道某些足球运动员习惯在运动场上通过挥手来跟队友进行交流。同样,我们也不能一看到“踢脚”动作就将视频归类为“足球比赛”,因为有些乒乓球运动员会通过“踢脚”动作来表达自己的感情。

我们分别统计在某段特定时间内,视频中“挥手”和“踢脚”动作的次数,发现如下规律:

  • 在乒乓球比赛的视频中,“挥手”的次数远多于“踢脚”的次数。

  • 在足球比赛的视频中,“踢脚”的次数远多于“挥手”的次数。

根据对一组视频的分析,得到如表1所示的数据。

表1  统计表格

视频编号

视频类型

挥手次数

踢脚次数

A

乒乓球比赛

4801

164

B

乒乓球比赛

4603

308

C

足球比赛

120

3866

D

乒乓球比赛

4417

412

E

乒乓球比赛

3367

526

F

乒乓球比赛

4335

140

G

乒乓球比赛

4222

365

H

乒乓球比赛

3427

190

I

足球比赛

130

4603

J

足球比赛

177

3332

K

乒乓球比赛

4980

532

L

乒乓球比赛

4240

258

M

乒乓球比赛

3040

556

N

乒乓球比赛

3521

300

O

乒乓球比赛

4763

256

P

足球比赛

259

4811

Q

足球比赛

369

4412

R

足球比赛

129

4143

S

乒乓球比赛

3863

236

T

足球比赛

365

4661

U

足球比赛

104

3130

V

足球比赛

172

4704

W

乒乓球比赛

4413

301

X

足球比赛

106

3596

Y

乒乓球比赛

3096

129

Z

足球比赛

589

4816

为了方便观察,将上述数据绘制为散点图

为了方便观察,将上述数据绘制为散点图,如图1所示。

图1  视频数据散点图

从图1中可以看到,数据点呈现聚集特征:

  • 乒乓球比赛视频中的数据点聚集在x轴坐标为[3000,5000],y轴坐标为[1,500]的区域。

  • 足球比赛视频中的数据点聚集在y轴坐标为[3000,5000],x轴坐标为[1,500]的区域。

此时,有一个视频Test,经过统计得知其中出现2000次“挥手”动作,100次“踢脚”动作。如果在图20-1中标注其位置,可以发现视频Test的位置最近的邻居是乒乓球比赛视频,因此可判断该视频是乒乓球比赛视频。

上面的例子是一个比较极端的例子,非黑即白,而实际的分类数据中往往参数非常多,判断起来也不会如此简单。因此,为了提高算法的可靠性,在实施时会取k个近邻点,这k个点中属于哪一类的较多,然后将当前待识别点划分为哪一类。为了方便判断,k值通常取奇数,这和为了能得到明确的投票结果通常将董事会成员安排为奇数的道理是一样的。

例如,已知某知名双胞胎艺人A和B长得很像,如果要判断一张图像T上的人物到底是艺人A还是艺人B,则采用K近邻算法实现的具体步骤如下:

  1. 收集艺人A和艺人B的照片各100张。

  2. 确定几个用来识别人物的重要特征,并使用这些特征来标注艺人A和B的照片。例如,根据某4个特征,每张照片可以表示为[156, 34, 890, 457]这样的形式(即一个样本点)。按照上述方式,获得艺人A的100张照片的数据集FA,艺人B的100张照片的数据集FB。此时数据集FA、FB中的元素都是上述特征值的形式,每个集合中各有100个这样的特征值。简而言之,就是使用数值来表示照片,得到艺人A的数值特征集(数据集)FA、艺人B的数值特征集FB。

  3. 计算待识别图像T的特征,并使用特征值表示图像T。例如,图像T的特征值TF可能为[257, 896, 236, 639]。

  4. 计算图像T的特征值TF与FA、FB中各特征值之间的距离。

  5. 找出产生其中k个最短距离的样本点(找出离T最近的k个邻居),统计k个样本点中属于FA和FB的样本点个数,属于哪个数据集的样本点多,就将T确定为哪个艺人的图像。例如,找到11个最近的点,在这11个点中,属于FA的样本点有7个,属于FB的样本点有4个,那么就确定这张图像T上的艺人为A;反之,如果这11个点中,有6个样本点属于FB,有5个样本点属于FA,那么就确定这张图像T上的艺人为B。

以上所述就是K近邻算法的基本思想,下面介绍一下K近邻手写数字识别。

K近邻手写数字识别

K近邻算法是借助“物以类聚、人以群分”来划分对象分类的方法。在需要判断一个对象的分类信息时,查找当前对象的最近K个邻居,通过这K个邻居的分类来判断当前对象的分类信息。

例如,有一个手写的数字,如何让计算机判断它是哪个数字呢?我们可以将该数字与一些已知的数字进行对比,看看它与哪些数字最相像。然后在与其相像的这堆数字中找出数量最多的数字,将该数字作为识别结果。

例如,我们找出与当前待判断数字最相像的7个数字(K=7),这7个数字中,有6个“数字2”,1个“数字3”。那么,就将7个数字中,数量最多的“数字2”(有6个)作为最终的识别结果。

在OpenCV中,已经对K近邻算法进行了封装,能够通过调用函数的形式实现K近邻算法。本文使用OpenCV自带的K近邻模块来实现手写数字识别。

【例】编写程序,演示K近邻算法。

在本例中,0~9的每个数字都有10个特征值。例如,数字“0”的特征值如图2所示。为了便于描述,将所有这些用于判断分类的图像称为特征图像。

图2 数字“0”的特征图像

上述过程是分步骤的分析结果,以下是全部源代码:

现在,我们要求修改例中的程序,使用OpenCV自带的函数完成对手写数字的识别。根据要求,编写代码如下:

本文节选自《OpenCV轻松入门:面向Python》。在计算机视觉这个崭新而又充满希望的研究领域,OpenCV作为辅助计算机视觉的工具,不可或缺。其与AI时代首选语言Python的结合,更产生巨大威力。其中,旨在提供易于使用的计算机视觉接口的库,包含各个领域500多个函数,将细细梳理,通透剖析——“轻松”我们是严肃的!

内容简介:本书基于面向 Python 的 OpenCV(OpenCVfor Python),介绍了图像处理的方方面面。本书以 OpenCV 官方文档的知识脉络为主线,并对细节进行补充和说明。书中不仅介绍了 OpenCV 函数的使用方法,还介绍了函数实现的算法原理。在介绍 OpenCV 函数的 使用方法时,提供了大量的程序示例。而且在介绍函数对图像的处理前,往往先展示函数对数值、数组 的处理,方便读者从数值的角度观察和理解函数的处理过程和结果。在介绍具体的算法原理时,本书尽量使用通俗易懂的语言和贴近生活的示例来说明问题,避免使用过多复杂抽象的公式。 本书适合计算机视觉领域的初学者阅读,包括在校学生、教师、专业技术人员、图像处理爱好者。

长按二维码,关注“前沿技墅”,抢先接收新知、了解书讯、结识大咖。任何伟大,无不起步于不经意间,你可以选择不经意错过,或不经意开始……

看完,赶紧点个“在看”鸭

点鸭点鸭

↓↓↓↓

k近邻算法_图穷匕见:K近邻算法与手写数字识别相关推荐

  1. 深度学习数字仪表盘识别_【深度学习系列】手写数字识别实战

    上周在搜索关于深度学习分布式运行方式的资料时,无意间搜到了paddlepaddle,发现这个框架的分布式训练方案做的还挺不错的,想跟大家分享一下.不过呢,这块内容太复杂了,所以就简单的介绍一下padd ...

  2. matlab朴素贝叶斯手写数字识别_机器学习系列四:MNIST 手写数字识别

    4. MNIST 手写数字识别 机器学习中另外一个相当经典的例子就是MNIST的手写数字学习.通过海量标定过的手写数字训练,可以让计算机认得0~9的手写数字.相关的实现方法和论文也很多,我们这一篇教程 ...

  3. python手写多个字母识别_一个带界面的CNN手写数字识别,使用Python(tensorflow, kivy)实现...

    CNN_Handwritten_Digit_Recognizer (CNN手写数字识别) A CNN handwritten digit recognizer with graphical UI, i ...

  4. 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别

    为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...

  5. 【人工智能】利用C语言实现KNN算法进行手写数字识别

    KNN算法称为邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心 ...

  6. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  7. 模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

    文章目录 前言 一. k-近邻算法(KNN) 1.算法介绍 2.举个例子--电影分类 3.步骤描述 4.来了--代码实现 二.实战之约会网站配对效果判断 1.导入数据 2.分析数据 3.数据归一化 4 ...

  8. 第7-3课:K 最邻近算法(KNN)与手写数字识别

    K 最近邻(KNN,K-Nearest Neighbor)算法是一类在数据挖掘领域常用的分类算法,该算法看似神秘,其实原理很简单,算法实现也很简单.KNN 算法在类别决策时,只参考极少量的相邻样本,也 ...

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

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

最新文章

  1. Spring Boot 为什么这么火?
  2. 相机位姿估计2:[应用]实时位姿估计与三维重建相机姿态
  3. 从零开始学python数据分析-从零开始学Python数据分析(视频教学版)
  4. Python中通过PyPDF2实现PDF拆分
  5. 初次使用Apache、ip地址、防火墙、域名、DNS、hosts文件、端口、URL介绍、Apache配置文件、配置虚拟主机、请求响应、http协议、
  6. oracle 复制数据 insert into、as select
  7. HTML学习总结(3)——Audio/Video
  8. 基于汇编语言的贪吃蛇程序
  9. 刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
  10. 金仓数据库KingbaseES之自增列
  11. 一个简单的Python暴力破解网站登录密码脚本
  12. Python学习笔记之八皇后问题
  13. 最新县及县以上行政区划代码(截止2016年7月31日)
  14. 【Power BI】分析仪在餐饮业中的应用
  15. HIDS逐渐的成为主流
  16. cad.net 图层隐藏 IsHidden 用法 eDuplicateRecordName 报错
  17. Java实验3 第十二题:财务应用程序:信用卡号的合法性
  18. 从Java程序猿到产品经理
  19. ssh远程连接服务器
  20. grep egrep命令中-w选项的用法

热门文章

  1. Oracle数据库常见问题处理
  2. Android支付接入(一):支付宝
  3. 微信小程序 text 标签小技巧
  4. Python实现天气查询功能(外加Excel技巧)
  5. UVM virtual interface errors
  6. 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?
  7. 解决国产电脑微信卡顿问题的脚本
  8. 百度云生态分享日 | AI技术实践与应用沙龙活动成功举办
  9. 交换机Access模式和Trunk模式配置演示
  10. MAC 合并多个jpg文件为PDF