K近邻算法

第一部分、K近邻算法
1.1、什么是K近邻算法
何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1时,算法便成了最近邻算法,即寻找最近的那个邻居。为何要找邻居?打个比方来说,假设你来到一个陌生的村庄,现在你要找到与你有着相似特征的人群融入他们,所谓入伙。
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入实例分类到这个类中。根据这个说法,咱们来看下引自维基百科上的一幅图:

**如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在,我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。
我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他/她身边的朋友入手,所谓观其友,而识其人。我们不是要判别上图中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从上图中,你还能看到:**

如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多

数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。

参考网络:http://blog.csdn.net/v_july_v/article/details/8203674

CvKNearest是opencv中实现K邻近分析的类,对于K近邻的理解可以查看博文http://blog.csdn.net/v_july_v/article/details/8203674

该类有主要的函数有两个:train和find_nearest,下面简单解释两个函数的参数意义和使用
CvKNearest::train(const Mat& trainData, const Mat& responses, const Mat& sampleIdx=Mat(), bool isRegression=false, int maxK=32, bool updateBase=false )
trainData: 即训练数据。
response: 对应每一个训练数据的类别或回归值;
sampleIdx: 暂时不清楚其意义;
isRegression:如果是true表示回归,false表示分类;
maxK: 最大的近邻个数
updateBase: 指定模型是否从头训练(update_base = false),或是更新使用新的训练数据(update_base = true)。在后一种情况下,参数maxK不得大于原始值。

float CvKNearest::find_nearest(const Mat& samples, int k, Mat* results, const float** neighbor, Mat* neighborResponses, Mat* dists) const
float CvKNearest::find_nearest(const Mat& samples, int k, Mat& results, Mat& neighborResponses, Mat& dists) const
samples: 输入参数,大小为样本数(rows)×样本特征数(cols);
k: 输入参数,即需要返回的k个邻近;
results: 输出参数,返回的结果(类别或者是回归值),大小为样本数(rows);
neighbor: 输出参数,返回的是指向邻居向量本身的指针,即指向的是原来的训练数据。
neighborResponses: 输出参数,输出每个样本对应的k个最邻近的response,大小为样本数(rows)×k;
dists: 输出参数,输出每个样本对应的k个最邻近的距离,大小为样本数(rows)×k;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值