统计学习方法——K近邻算法

目录

 

K近邻的思想

距离怎么算

K的取值

预测规则

应用:kd树

kd树的构建

kd树的搜索


K近邻的思想

今天介绍的K近邻算法是一种思想非常简单的分类回归算法。顾名思义,预测结果肯定是和样本最靠近的K个邻居有很大的关系。不同于其他算法,需要先训练模型才可以进行预测,K近邻算法直接选择与我们要预测的样本点距离最近的K个样本,然后用这个K个邻居的标签值根据一定的规则得出预测结果。那么问题来了:1. 距离怎么算? 2. K的取值? 3. 确定预测结果的规则是什么呢?下面我们一一来解答一下这三个问题。

距离怎么算

我们听到过很多计算距离的方法:余弦距离、欧氏距离、曼哈顿距离、切比雪夫距离等等...我们经常用到的就是欧式距离了,在K近邻算法里最常用的也是欧式距离dis(x_{1}-x_{2}) = \sqrt{\sum_{j=1}^m\left \| x_{1}^{j} -x_{2}^{j}\right \|^2},说到欧式距离,就要提一下L_p距离,计算公式:

L_{p}(x_{1},x_{2}) = \sqrt[\frac{1}{p}]{\sum_{j=1}^m \left \| x_{1}^{j}-x_{2}^{j} \right \|^p},当p=1时代表曼哈顿距离;p=2时是欧氏距离;p=无穷大时代表切比雪夫距离。

K的取值

当K=1时,该算法为最近邻算法,算法会将新数据预测为与和它距离最近的训练数据一样的标签。通常K值是通过交叉验证确定的。K值的选择对预测结果有什么影响呢?

K值小的时候,对噪声点敏感,算法的近似误差小,估计误差大。近似误差和估计误差的理解大家可以参考知乎上喬木先生的答案https://www.zhihu.com/question/60793482

K值大的时候,算法的近似误差增大,估计误差减小,因为算法每次预测的时候参考的样本点比较多,噪声的影响就会减小。

预测规则

在分类问题中,预测规则是多数表决,即样本的K个邻居中哪类样本多,那就归为哪一类

在回归问题中,预测规则是取平均,即对样本的K个邻居的标签值取平均,作为预测结果

应用:kd树

K近邻算法如果用线性扫描的方法实现,算法的时间复杂度为O(n);如果用树形结构来存储数据,就可以将算法的时间复杂度优化到O(logn),这便是kd树了。注意:这里的k和K近邻算法里的K含义不同,这里的k是指数据维度。

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。

先上一个kd树的例子(图片是百度搜索到的,若有侵权请联系)

下面分别介绍一下kd树的构建和搜索过程。

kd树的构建

输入:样本集X=\left \{ x_{1}, x_{2}, x_{3}, ..., x_{n} \right \},其中x_{i} = \left \{ x_{i}^{1}, x_{i}^{2},...,x_{i}^{m}\right \},m是指特征维度,和kd树的k是相同的含义,为了和K近邻的K区分开,用m代替

(1) 构造根结构,根据第一维特征的大小将所有样本排序,以中位数为中心将样本分为两类,分别作为根节点的左右子树;

(2) 对于左右子树,分别选取第2、3...维特征变按照中位数进行子树的划分,直至每个样本空间仅有一个样本

kd树的搜索

输入:x=\left \{ x^{1}, x^{2}, ...,x^{m} \right \},kd树

输出:样本的类别

(1) 搜索kd树中包含x的叶子结点作为“当前最近点”计入k近邻数组中。具体步骤:从根节点开始,选择kd树当前层的划分维度,如果x对应维度大于节点值,到右子节点;如果x小于当前节点值,到左节点;

(2) 递归的向上回退:

     (a) 如果当前k近邻数组中的元素少于k个,将当前节点的父节点加入k近邻数组中;否则,判断当前节点是否在K近邻球内部,如果在,就用当前节点的父节点代替k近邻数组中与x距离最远的样本

     (b) 如果当前k近邻数组中元素少于k个,将当前节点的兄弟节点加入k近邻数组;否则查看兄弟节点所在的区域与K近邻球是否相交,如果相交,在兄弟节点区域递归查看是否有在K近邻球内部的节点

(3) 回退到根节点时结束搜索。用K近邻数组中的样本规矩预测规则得到x的预测结果。

*注:K近邻球是指:以x为球心, \max_{x_{i}\in kner}dis(x_{i}, x)为半径的球,每次K近邻数组(kner)更新后,K近邻球也需要更新。

 

  • 7
    点赞
  • 30
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

我是刘某某

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值