K近邻

概述

K近邻(K-nearest neighbor,k-NN)可以是分类和回归方法,是一种有监督方法。

通俗的说,k近邻回归的思想是,假如想预测你的收入,那么通过某种距离计算(如考虑行业、学历、年龄等),找k个和你相似的人,他们的收入求均值即作为你的收入预测。

根据k个邻居的类别,采用多数表决等方法确定新实例的类别,或根据邻居的值预测新实例的值。

k近邻的三个要素:①距离度量,②k(邻居数)的选择,③分类决策规则

k近邻的实现方法是kd树,是一种高效搜索邻居的算法。

距离度量可以是一般的L_p 距离(或Minkowski、闵可夫斯基、闵氏距离)。

k值选择过小,偏差小方差大,容易过拟合(最极端的情况,只有一个邻居,这个人的收入就决定了自己收入预测值)

k值选择过大,偏差大方差小,模型过于简单(最简单的是k选择全体样本的数量,所有人都是你的邻居)。

可用交叉验证确定参数k。

分类决策规则一般用多数表决规则。多数表决规则等价于经验风险最小化。经验风险最小化就是让模型在样本中的表现最好,它与结构风险最小化概念的区别是,后者是经验风险最小化+正则化。

kd树

kd树(kd-tree)是一个二叉树,对k维空间的点存储位置,便于快速检索的树形结构。kd树可以帮助K近邻快速搜索邻居。

构造

kd树一般用垂直于坐标轴、且经过该该维坐标中位数的点的超平面不断切分,直到涵盖所有数据位置。

例如有三维数据,按照第一维的中位数、第二维的中位数、第三维的中位数、第一维的中位数……进行划分。

例如根据一组数[(2, 3), (5, 4), (9, 6), (4, 7), (8, 1), (7, 2)],这是6个二维的数据,首先根据第一维的中位数将区域划分。第一维中位数是6,不妨选择7。即x=7将区域划分为两部分。

K近邻

然后看第二维,左半部分(x<7的三个数)第二维中位数是4,右半部分不妨设为6。直到所有数据点都在切分线上。

最终结果是

K近邻


搜索

1. 根据目标点,从kd数的根节点往下,根据该节点划分时候对应维度和目标点对应维度的大小,将该节点划到左子节点或右子节点,最终找到叶子结点。

例如目标点为(3, 4.5),最初与根节点(7, 2)比,该层划分时候是以x轴中位数标准划分的,所以要将目标点的x轴数字3与7比较,3<7所以划到左边。然后将其与(5, 4)比,4.5 > 4,所以划到右边,得到(4, 7)

2. 然后初始化最近点为叶子结点,并画出以目标点为圆心,目标点和叶子结点距离为半径的圆。最近邻居一定在圆内。

例如上例中,初始化最近点是(4, 7),画出以(4, 7)为圆心,目标点与该点距离为半径的圆。那么可以说最近的邻居一定在圆内,否则(4, 7)就是最近的邻居。

3. 然后往上回溯,找父节点,父节点另一侧的矩形是否与圆相交。若不相交则向上回溯(此时计算时可以省略很多节点),若相交,则找到与圆相交的点,检查是否更新最近邻居、更新圆。

例如此时向上回溯到(5, 4),该点到目标点距离更近,那么将该点置为当前最近点。仿照上述过程重新画一个圆。

是否要去(5, 4)另一半子节点查找是否有更近的呢?这要看y=4是否与圆相交,这里是相交的,所以要去另一半叶子结点找,那么(2, 3)与目标点距离更新,所以当前最近点置为(2, 3)。同样画一个圆。

此时再向上回溯到(7, 2)另一个矩形与该圆不相交(或者说x=7与圆不相交),因此右半部分无论如何都不可能比现有的点更近了,此时结束。因此最近邻居就是(2, 3)



参考资料:

1. 李航《统计机器学习》

2. 《KNN算法与Kd树》https://www.cnblogs.com/21207-iHome/p/6084670.html