1 概述
K近邻(K-nearest neighbor,k-NN)可用于分类和回归,是一种有监督方法。
通俗的说,k近邻回归的思想是,假如想预测你的收入,那么通过某种距离计算(如考虑行业、学历、年龄等),找k个和你相似的人,他们的收入求均值即作为你的收入预测。
根据k个邻居的类别,采用多数表决等方法确定新实例的类别(分类问题),或根据邻居的值预测新实例的值(回归问题)。
k近邻的三个要素:①距离度量,②k(邻居数)的选择,③分类决策规则
2 距离度量及K的选择
距离度量可以是一般的L_p 距离(或Minkowski、闵可夫斯基、闵氏距离)。
k值选择过小,偏差小方差大,容易过拟合(最极端的情况,只有一个邻居,这个人的收入就决定了自己收入预测值)
k值选择过大,偏差大方差小,模型过于简单(最简单的是k选择全体样本的数量,所有人都是你的邻居)。
可用交叉验证确定参数k。
3 分类决策规则
分类决策规则一般用多数表决规则。多数表决规则等价于经验风险最小化。经验风险最小化就是让模型在样本中的表现最好,它与结构风险最小化概念的区别是,后者是经验风险最小化+正则化。
4 kd树
K近邻可以循环所有训练样本,用新样本与训练样本分别计算距离,但是当训练样本过多时,计算开销过大。改进方法是可以用kd树。kd树(K-dimension tree)是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
kd树(kd-tree)是一个二叉树,存储k维空间中点的位置,便于快速检索。kd树可以帮助K近邻快速搜索邻居。
4.1 构造
kd树一般用垂直于坐标轴、且经过各维坐标中位数的点的超平面不断切分,各维度交替使用,直到涵盖所有数据位置。
例如有三维数据,按照第一维的中位数、第二维的中位数、第三维的中位数、第一维的中位数……进行划分。
4.2 数值例子
例如有6个点,A=(2, 3), B=(5, 4), C=(9, 6), D=(4, 7), E=(8, 1), F=(7, 2),这是6个二维的数据,首先根据第一维的中位数将区域划分。第一维中位数是6,不妨选择7。即x=7将区域划分为两部分。
然后看第二维,左半部分(x<7的三个点,即ABD)第二维分别是3、4、7,中位数是4,右半部分的点是CE,,第二维分别是6、1,不妨设为6。持续进行,直到所有数据点都在切分线上。
最终结果是
4.3 搜索
1. 根据目标点,从kd数的根节点往下,根据该节点划分时候对应维度和目标点对应维度的大小,将该节点划到左子节点或右子节点,最终找到叶子结点。
例如目标点为(3, 4.5),最初与根节点(7, 2)比,该层划分时候是以x轴中位数标准划分的,所以要将目标点的x轴数字3与7比较,3<7所以划到左边。然后将其与(5, 4)的y轴比,4.5 > 4,所以划到右边,得到(4, 7)
2. 然后初始化最近点为叶子结点,并画出以目标点为圆心,目标点和叶子结点距离为半径的圆。最近邻居一定在圆内。
例如上例中,初始化最近点是(4, 7),画出以(4, 7)为圆心,目标点与该点距离为半径的圆。
下图中红色点为目标点,绿色为画出的圆,蓝色为父节点另一侧矩形。
3. 然后往上回溯,找父节点,父节点另一侧的矩形是否与圆相交。若不相交则向上回溯,忽略另一分支(此时计算时可以省略很多节点),若相交,则找到与圆相交的点,检查是否更新最近邻居、更新圆。
上例中可看出,圆圈与另一侧矩形相交,因此找到与圆相交的点(5, 4),该点到目标点距离更近,那么将该点置为当前最近点。仿照上述过程重新画一个圆。
是否要去(5, 4)另一半子节点查找是否有更近的呢?这要看y=4是否与圆相交,这里是相交的,所以要去另一半叶子结点找,那么(2, 3)与目标点距离更新,所以当前最近点置为(2, 3)。同样画一个圆。
此时再向上回溯到(7, 2)另一个矩形与该圆不相交(或者说x=7与圆不相交),因此右半部分无论如何都不可能比现有的点更近了,此时结束。因此最近邻居就是(2, 3)
4.4 总结
笔者用更通俗的语言说明,kd树是先根据划分标准找到叶子节点,然后找到父节点,在父节点另一子树中重复此操作,直到遍历所有节点。
在此过程中,可以根据目标点与最近距离所形成的圆与父节点另一子树代表的区域是否有交点,判断是否需要忽略另一子树,类似于剪枝。
参考资料
1. 李航《统计机器学习》
2. 《KNN算法与Kd树》https://www.cnblogs.com/21207-iHome/p/6084670.html