机器学习算法总结之K近邻(KNN)

写在前面

K近邻(K-nearest neighbor,k-nn)是一种常用的机器学习监督学习方法,可用于分类和回归问题。其工作机制为:给定测试样本,基于某种距离度量找出训练集中与其最靠近的K个训练样本,然后基于这K个邻居来预测给定样本。对于分类任务,可使用“投票法”;对于回归任务,可使用“平均法”,即取这K个邻居的平均值最为预测结果,进一步地,还可以对K个邻居距离的远近进行加权处理后预测结果。

与其他学习方法不同,KNN不是一种显示的学习过程,实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。K值的选择,距离度量以及分类决策规则是KNN的三个基本要素。

1. KNN模型

KNN模型有三个基本要素——距离度量、k值的U型安泽和分类决策规则。下图是一个knn分类模型实例,假设在距离度量规则选择是“恰当”情况下,虚线显示出等距线,测试样本在k=1或k=5时被判别为正类,在k=3时判别为负类。

机器学习算法总结之K近邻(KNN)

1.1 距离度量

两个实例点的距离是两个实例点相似程度的反映。 

Lp距离的定义如下:

 机器学习算法总结之K近邻(KNN)

当p=1时,称为曼哈顿距离:

机器学习算法总结之K近邻(KNN)

当p=2时,称为欧氏距离:

机器学习算法总结之K近邻(KNN)

当p=正无穷时,是各个坐标距离的最大值:

机器学习算法总结之K近邻(KNN)


机器学习算法总结之K近邻(KNN)

1.2 K值的选择

在上述已经说明,k值的不同会对knn算法结果产生重大影响。

如果k值较小,就相当于用较小的邻域中的训练实例进行预测,只有与输入实例较近的训练实例才会对预测结果起作用,预测结果会对近邻的实例点非常敏感,意味着整体模型变得复杂,容易发生过拟合。

如果k值较大,则相当于用较大邻域中的训练实例进行预测,这时与训练实例较远的训练实例也会对预测起作用,k值增大意味着整体模型变的简单。 

实际应用中,k值一般取一个比较小的数据(不超过20),通常采用交叉验证法来选取最优值。

1.3 分类决策规则

一般使用多数表决,即由输入实例的k个近邻的训练实例中的多数类决定输入实例的类。

2. KNN算法

机器学习算法总结之K近邻(KNN)

3. KNN的实现:kd树(k-dimension tree)

kd树是一种对k维空间的实例点进行存储以便对其进行快速检索的树形数据结构。它是二叉树,表示对k维空间的一个划分,构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。

3.1 构建kd树

kd树就是把整个空间划分为特定的几个部分,然后在特定空间的部分内进行相关搜索操作。通常依次选择坐标轴对空间进行切分,选择训练实例点在选定坐标轴上的中位数为切分点,这样得到的kd树是平衡的,但平衡kd树的搜索效率未必是最优的。下面是构建平衡kd树的算法

机器学习算法总结之K近邻(KNN)

机器学习算法总结之K近邻(KNN)

贴一个构建平衡kd树的例子:

机器学习算法总结之K近邻(KNN)

得到的kd树如下:

机器学习算法总结之K近邻(KNN)

3.2 搜索kd树

kd树构建完毕后,利用kd树进行k近邻搜索。在kd树上进行近邻搜索时,很多时候可以不进入某个父节点的另一个子节点(省去了另一个子节点数据点的查找)。kd树查找的具体算法如下:
算法输入:构造完毕的kd树,需要分类的目标点x
算法输出:目标点x的k近邻点
算法过程:
  • (1)通过深度优先方法,在kd树中搜索到目标点的所在的叶节点。(注:该搜索并不能直接找到最近邻点)搜索方法如下,在搜索每一层的过程中,根据该层的分割特征的序数,来对目标点的该序数的特征进行分类(决定是进入左子节点还是右子节点)。
  • (2)以该叶节点作为当前的NN(最近邻)点,计算该叶节点与目标点的距离,并设为当前的最小距离。
  • (3)计算该叶节点父节点与目标点的距离,若小于当前的最小距离,则更新当前的最小距离以及当前的NN点(被覆盖的点先记录下来)
  • (4) 判断是否要进入父节点的另一个子节点:  判断方法为:计算父节点在其分割特征上的值距离目标点在该特征上的值的距离,若该距离小于当前的最小距离,则进入另一个子节点,否则不进入。既:检查另一子节点对应的区域是否与以目标点为球心,以目标点与当前的NN点的距离为半径的球体相交。若相交则进入,反正不进入。
            a)若不进入另一个子节点,则以此父节点视为叶节点,重复步骤3。
            b)若进入另一个子节点,则对右边节点以下的子树执行步骤1,找到新的叶节点。判断是否要更新NN点与当前最小距离。随后以该叶节点开始,重复步骤3。

以此类推,搜索过程中将不断向跟节点回退。在向根节点回退的过程中,不必再次进入从中退出的子节点,保证过程不会进入死循环。
  • 5 当回退到根节点时(且以根节点与目标点的距离来更新最小距离与NN点后),最后的NN点即为x的最近邻点。且记录下来的所有NN点,对应的距离,最小的K个即为K近邻点。

如果实例点是随机分布的,则kd树搜索的平均及计算复杂度是O(logN)


小结

kd树更适用于训练示例远大于空间维数时的knn搜索,当两者接近时,他的效率会大大下降,几乎接近线扫描。

参考资料:

机器学习算法与Python实践之(一)k近邻(KNN)

K近邻法之kd树及其Python实现

Kd Tree算法原理和开源实现代码

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

KD树详解及KD树最近邻算法

利用KD树进行异常检测