基础概念
k近邻法是一种基本的分类与回归方法,这里只讨论分类问题中的k近邻法。
第三章 k近邻法
1.k近邻算法
算法描述:首先给定一个训练集,对于待分类的输入数据,在训练集中找到与该输入数据最邻近的k个样本,这k个样本中哪个类别最多,就把待分类数据分给这个类。
k近邻法没有显式的学习过程。
2.k近邻模型
k近邻法的三个基本要素:(当这三个要素确定后,任何一个新的输入实例,它所属的类别唯一确定)
-
距离度量
距离度量是用来衡量样本之间距离的,不同的距离度量,所确定的最近邻点是不一样的。 -
k值的选择
k太大或太小都不好。如果太小,预测结果会对近邻的实例点很敏感,模型复杂,容易过拟合;如果太大,较远处的(不相似的)实例点也会起作用。(最极端情况,k=N,无论输入什么,都被分到训练集中最多的类,模型过于简单)k值的一般选取原则:一般取一个比较小的值,通常采用交叉验证来选取最佳k值。
-
分类决策规则
一般采取多数表决规则,(多数表决规则等价于经验风险最小化)
3.k近邻法的实现:kd树
3.1 构造kd树
kd树是一个二叉树,平衡kd树是每次对半分(从中位数处切)
例题:给定训练集 T = {(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造平衡kd树。
解法步骤:
- 分别在坐标系中标出这六个点,分别记为A~F,如图所示
- 在x1方向上,选择中位数处的节点,将x1方向一分为二,如下图红线所示,F节点作为根节点。左半空间变成了左子树,右半空间变成了右子树。
- 在x2方向上,对于左半空间(左子树),选择中位数处的点B,在x2方向上切一刀,如红线所示,B节点作为根节点的左节点;右半空间同理,选择C点,在x2方向上切一刀,选择C点作为根节点的右子节点。
- 对于节点B来说,它的下半部分即为它的左子树,上半部分是它的右子树,所以A为B的左节点,D为B的右节点。切法如下图红线所示。
5.这样就能构造出一个kd平衡树:
3.2 搜索kd树
需要解决的问题是:对于一个给定的kd树,如何用它来进行k近邻搜索。这里只讲最近邻,k近邻也是同理的。
例子:如下图,S点是待分类点,求S的最近邻。
步骤:
- 先在kd树中找到S点所属的叶节点D(S落在D的区域内)
- 以D作为S的最近邻,以S为圆心,D为半径画圆,真正的最近邻一定在圆的内部。
- 回溯的过程。返回D的父节点B,在B的另一子节点F的区域内搜索最近邻,没有找到(因为F区域与圆无交点),继续往上回溯到父节点A,在节点A的另一子节点C的区域内找,节点C与圆相交,而且该区域内存在节点E,比D点更近,所以成为新的最近邻近似。
- 最后得到点E是点S的最近邻。
最后,关于kd树,这里分享两个比较好的链接:
5. https://www.jianshu.com/p/ffe52db3e12b (这个链接写的超级好)
6. https://leileiluoluo.com/posts/kdtree-algorithm-and-implementation.html