统计学习方法 李航 k近邻算法
k近邻算法
一.k近邻算法基本描述
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最相近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类.
二.k近邻模型
该模型有三个基本要素:距离度量,k值的选择,分类决策规则.当这三个要素确定后,便能对于任何一个新的输入实例,给出唯一确定的分类.这里用图片说明更清楚,对于训练集中的每一个样本,距离该点比其他点更近的所有点组成一片区域,叫做单元.每个样本都拥有一个单元,所有样本的单元最终构成对整个特征空间的划分,且对每个样本而言,它的标签就是该单元内所有点的标记.这样每个单元的样本点的标签也就是唯一确定的.(我感觉这图片真的很形象)
下面来简要说下这三个基本要素
三.三要素
1.距离度量
当然,一般都是用的欧式距离,但也应该了解还有那些距离度量方法:
如lp距离:
2.k值的选择
k值过小
- 近似误差减小,估计误差增大
- 易受噪声影响
- 易发生过拟合
k值过大
- 近似误差增大,估计误差减小
- 忽略有效信息
3.分类决策规则
最主要用的一般是多人表决,当然,还有加权表决等
四.k近邻算法的实现:kd树
其实我们已经可以实现k近邻算法了,即线性扫描,但当数据量很大时,会非常耗时,所以我们需要一种数据结构来存储训练数据,来优化算法,这里介绍的就是kd树.
1.构造kd树
这里书上讲的挺抽象的,我来解释下,其实就是循环地以每个特征的中位数所对应的那个样本作为分割点来构造二叉树,直至所有的样本全都包含在树中.
2.搜索kd树
这里书中仅讲了最近邻的搜索,并未说明k近邻,没什么意义,所以我不打算实现它,关于k近邻的完整实现则可以看我的另一篇博客.
这里同样很抽象,但书中的例子却很清晰,你可以先看下例子,然后再回去看算法描述.
五.补充
k近邻算法,除了kd树来实现,还有BBF,球树.
网上kd树都是实现的最近邻搜索,
k近邻搜索可参考这道HDU4347http://acm.hdu.edu.cn/showproblem.php?pid=4347
另外这篇博客对此题的原理解释的很清楚https://blog.csdn.net/javays1/article/details/50369176
六.参考
- <<统计学习方法>>
- https://www.jianshu.com/p/73a0a3b229e6