KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。

这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本周围K个最近邻以给出该样本的相应值。这种方法有时候被称作“基于样本的学习”,即为了预测,我们对于给定的输入搜索最近的已知其相应的特征向量。

简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属于这个类别。

有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在,我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。

判别上图中那个绿色的圆是属于哪一类数据就从它的邻居下手。但一次性看多少个邻居呢?从上图中,你还能看到:

  • 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。

KNN算法的步骤

  1. 计算已知类别数据集中每个点与当前点的距离;
  2. 选取与当前点距离最小的K个点;
  3. 统计前K个点中每个类别的样本出现的频率;
  4. 返回前K个点出现频率最高的类别作为当前点的预测分类。
  • 训练KNN模型
bool CvKNearest::train( const CvMat* _train_data, const CvMat* _responses,const CvMat* _sample_idx=0,bool is_regression=false, int _max_k=32, bool _update_base=false );

这个类的方法训练K近邻模型。

它遵循一个一般训练方法约定的限制:只支持CV_ROW_SAMPLE数据格式,输入向量必须都是有序的,而输出可以 是 无序的(当is_regression=false),可以是有序的(is_regression = true)。并且变量子集和省略度量是不被支持的。

参数_max_k 指定了最大邻居的个数,它将被传给方法find_nearest。

参数 _update_base 指定模型是由原来的数据训练(_update_base=false),还是被新训练数据更新后再训练(_update_base=true)。在后一种情况下_max_k 不能大于原值, 否则它会被忽略。

  • 寻找输入向量的最近邻
float CvKNearest::find_nearest( const CvMat* _samples, int k, CvMat* results=0, const float** neighbors=0, CvMat* neighbor_responses=0, CvMat* dist=0 ) const;

参数说明:

  1. samples为样本数*特征数的浮点矩阵;
  2. K为寻找最近点的个数;results与预测结果;
  3. neibhbors为k*样本数的指针数组(输入为const,实在不知为何如此设计);
  4. neighborResponse为样本数*k的每个样本K个近邻的输出值;
  5. dist为样本数*k的每个样本K个近邻的距离。

对每个输入向量(表示为matrix_sample的每一行),该方法找到k(k≤get_max_k() )个最近邻。在回归中,预测结果将是指定向量的近邻的响应的均值。在分类中,类别将由投票决定。

对传统分类和回归预测来说,该方法可以有选择的返回近邻向量本身的指针(neighbors, array of k*_samples->rows pointers),它们相对应的输出值(neighbor_responses, a vector of k*_samples->rows elements) ,和输入向量与近邻之间的距离(dist, also a vector of k*_samples->rows elements)。

对每个输入向量来说,近邻将按照它们到该向量的距离排序。

对单个输入向量,所有的输出矩阵是可选的,而且预测值将由该方法返回。

一般的分类模型建立的步骤,分类一般分为两种:

  • 决策树归纳(消极学习法):先根据训练集构造出分类模型,根据分类模型对测试集分类。

消极学习法在提供训练元组时只做少量工作,而在分类或预测时做更多的工作。KNN就是一种简单的消极学习分类方法,它开始并不建立模型,而只是对于给定的训练实例点和输入实例点,基于给定的邻居度量方式以及结合经验选取合适的k值,计算并且查找出给定输入实例点的k个最近邻训练实例点,然后基于某种给定的策略,利用这k个训练实例点的类来预测输入实例点的类别。

  • 基于实例的方法:推迟建模,当给定训练元组时,简单地存储训练数据(或稍加处理),一直等到给定一个测试元组。

转载于:https://www.cnblogs.com/farewell-farewell/p/5910834.html

OpenCV——KNN分类算法 摘相关推荐

  1. python分类算法_用Python实现KNN分类算法

    本文实例为大家分享了Python KNN分类算法的具体代码,供大家参考,具体内容如下 KNN分类算法应该算得上是机器学习中最简单的分类算法了,所谓KNN即为K-NearestNeighbor(K个最邻 ...

  2. KNN 分类算法原理代码解析

    作者 | Charmve 来源 | 迈微AI研习社 k-最近邻算法是基于实例的学习方法中最基本的,先介绍基x`于实例学习的相关概念. 基于实例的学习 已知一系列的训练样例,很多学习方法为目标函数建立起 ...

  3. 用Python开始机器学习(4:KNN分类算法)

    转自: http://blog.csdn.net/lsldd/article/details/41357931 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classi ...

  4. k近邻算法(KNN)-分类算法

    k近邻算法(KNN)-分类算法 1 概念 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. k-近邻算法采用测量不同特征值之间的 ...

  5. 利用python语言实现分类算法_使用python实现kNN分类算法

    k-近邻算法是基本的机器学习算法,算法的原理非常简单: 输入样本数据后,计算输入样本和参考样本之间的距离,找出离输入样本距离最近的k个样本,找出这k个样本中出现频率最高的类标签作为输入样本的类标签,很 ...

  6. 《机器学习实战》学习总结(一)KNN分类算法原理

    kNN分类算法属于有监督类学习算法. 该分类算法不需要训练算法,直接对待分类点进行决策分类. 算法实现过程如下: 1.计算测试点与已知类别数据集中点的距离: 2.对距离进行排序(递增). 3.选取与测 ...

  7. Python实现knn分类算法(Iris 数据集)

    1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算法,是一个概念极其简单,而分类效果又很优秀的分类算法. 他的核心思想就是,要确定 ...

  8. 从原始文档到KNN分类算法实现(一)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 建立原始文档 ~/corpus/C1下建三个文件:0,1,2.内容分别为: 0 眼睛 明亮 健康 身体 发达 1 高大 身材 胳膊 勇猛 四肢 2 ...

  9. knn分类算法实现手写体数字识别python

    之前写过knn分类算法代码,想把knn用于设别手写体数字,看下正确率. 大概思路:获取图片(可以自己写,我之前有写过黑白图片转文本的代码,也可以网上找,反正数据量大会更好)->转成文本-> ...

最新文章

  1. 同时进科俩博士,一个被围着宠着、一个却被当成空气;凭什么?
  2. 【linux+C】神器 vim + 指针相关客串
  3. [考试]20151019图论
  4. 使用feof()判断文件结束时会多输出内容的原因
  5. Netflix的Hystrix使用教程
  6. Python高阶——argparse(命令行与参数解析)
  7. 在tunnelbroker为服务器IP建立IPV6 Tunnel
  8. Visio实现箭头反向
  9. 全国最大SLAM开发者学习交流社区 欢迎加入
  10. UE4虚拟摄像头插件
  11. GTP编译报错,需要增加IBUF
  12. Win10笔记本WIFI的标志突然变成了一个地球的解决方案(二)
  13. html5四季特点,美国一年四季天气特点介绍
  14. Hadoop部署(一) Ubantu Java JDK安装
  15. 认认真真推荐9个高质量公众号
  16. 以大多数人的努力程度之低,根本轮不到拼智商
  17. opencv RGB与HSV转化
  18. 苹果4s怎么越狱教程_苹果手机:iOS12怎么降级iOS12一键刷机降级教程
  19. 充电枪cp信号控制板_一种电动汽车交流充电系统的CP信号电压检测方法及装置与流程...
  20. Centos 7.2内核版本升级(无外网)

热门文章

  1. 天天动听 悬浮歌词(迷你歌词)效果解读
  2. 我的理解:什么是WCF
  3. Struts源码研究 - Bean-Message标签篇
  4. 风口上的政府大数据 需要消除“大误区”
  5. dbcp2和dbcp 1.4在API层面的差异
  6. PHP memcache实现消息队列实例
  7. 团队项目—后续阶段第一天
  8. 用RSA实现Web单点登录密码的加密传输
  9. Atlas风云——送给防范网络侵权的人
  10. FastDFS + Nginx代理方式访问