深入浅出理解kNN(k近邻算法)

什么是kNN?

kNN 的名字中虽然含有 NN,但并不是我们常说的Neural Network神经网络。 kNN 英文全程 k - Nearest Neighbor, 中文名 k近邻算法。 kNN 根据待分类样本周围的已知类别样本来判断待分类样本的类别。简单说, 如果你周围都是猴子,那 kNN 就认为你是猴子, 如果你周围都是大学生,那 kNN 就认为你是大学生。

如图,现在有一个水果,我们想知道它是梨还是苹果,于是我们根据它的大小形装颜色把它定位到坐标轴中,再看它在坐标轴中周围一定范围内的苹果多还是梨多,如果苹果多,就认为它是苹果,如果梨多,就认为它是梨。 显然,我们现在应该把它当成苹果。

KNN中的 k 指的是 kNN 中的 k 值得是k个邻居,k = n就是根据最近的n个邻居来判断待定样本的类别。 如上图,k = 3, 大小和颜色是数据的特征,用于坐标轴中的定位,苹果和梨是数据的标签。

计算距离时,既可以使用直线距离,也就是欧氏距离;也可以使用坐标轴距离绝对值的和,也就是曼哈顿距离; 等等...

kNN 中 k 的取值非常重要,如果k太小,容易受到个例影响,k太大,又不能很好的体现Nearest。如图:

当k = 4时, 待定样本被认为是苹果, 而当k = 11时,待定样本被认为是梨。

k的取值受到数据集类型和数据集大小影响,往往需要反复尝试。

kNN 的 步骤可以简单的描述为:

1))计算样本与所有样本的距离;

2)按距离 近 -> 远 排列;

3)统计前 k 个样本的类别, 归属最多的那个类别即判定为待定样本的类别。

 

确定k值

前面已经提到,k值的选取会对 kNN 分类效果产生很大影响,那么应该如何选取 k 值呢?可以采用 逐个尝试的办法,但即使对于小数据集工作量也很大,而且并不是人人都是 炼丹大师。

对于较小的数据集,我们通常采用交叉验证的方法。  

交叉验证: 程序自己按一定规则尝试多个 k 值,对每一个 k ,记录其在验证集上的错误次数,取错误数最小的 k 。

kNN 的思想比较简单,具体实现在sklearn中也已经封装好,用到时可以直接调用,且sklearn中也封装有交叉验证确定k值的方法,以及鸢尾花等数据。

猜你喜欢

转载自blog.csdn.net/weixin_42765557/article/details/115061208
今日推荐