李航-统计学习方法-笔记-3:K近邻法(knn)
概述
k近邻法是一种基本分类与回归方法,本书只讨论用于分类;
原理:k近邻法假设给定一个训练数据集,其中实例的类别已定,分类时对于新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方法进行预测。
三要素:k值的选择,距离度量,分类决策规则
三元素选择
1.k值
k值减小意味着整体模型变复杂,容易发生过拟合;过大模型过于简单,可能忽略训练实例中大量有用信息。
选择:一般选取一个比较小的数值,通常采用交叉验证法来选取最优的k值。
2.距离度量 详情看链接:https://blog.csdn.net/pxhdky/article/details/85067808
Lp距离(闵可夫斯基距离);
p=2为欧氏距离;
p=1为曼哈顿距离;
p=无穷,切比雪夫距离,是各个坐标距离的最大值
3.分类决策规则
knn中往往采用多数表决;等价于经验风险最小化。
knn的实现:kd树
实现knn时,主要考虑的问题是如何对训练数据进行快速的k近邻搜索,这点在特征空间维度大及训练数据容量大时尤其必要。
kd树是一种对k维空间的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是二叉树。KD树是基于欧式距离度量的。
构造kd树
李航内容链接:https://blog.csdn.net/u010002184/article/details/86654411
- 随着树的深度轮流选择轴当作分区面。(例如:在三维空间中根节点是 x 轴垂直分区面,其子节点皆为 y 轴垂直分区面,其孙节点皆为 z 轴垂直分区面,其曾孙节点则皆为 x 轴垂直分区面,依此类推。)
- 点由垂直分区面之轴座标的中位数区分并放入子树
这个方法产生一个平衡的k-d树。每个叶节点的高度都十分接近。
搜索kd树
参考链接:https://blog.csdn.net/Losteng/article/details/50893739(简明易懂)
从root节点开始,DFS搜索直到叶子节点,同时在stack中顺序存储已经访问的节点。
如果搜索到叶子节点,当前的叶子节点被设为最近邻节点。
然后通过stack回溯:
如果当前点的距离比最近邻点距离近,更新最近邻节点.
然后检查以最近距离为半径的圆是否和父节点的超平面相交.
如果相交,则必须到父节点的另外一侧,用同样的DFS搜索法,开始检查最近邻节点。
如果不相交,则继续往上回溯,而父节点的另一侧子节点都被淘汰,不再考虑的范围中.
当搜索回到root节点时,搜索完成,得到最近邻节点。