k近邻法(k-nea。rest neighbor,k-NN)是一种基于分类与回归方法。
分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方法进行预测。
因此,k近邻法不具有显示的学习过程。k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。
k近邻法有三个基本的要素:k值的选择、距离度量及分类决策规则;
k近邻法的一个实现方法——kd树;
1、k近邻算法:
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类;
2、算法1:k近邻算法——没有显示的学习过程,即没有显示的梯度更新过程。
距离度量和分类决策是关键;
k近邻法使用的模型实际上对应于对特征空间的划分,模型由三个基本要素——距离度量、k值的选择和分类决策规则决定。
1、模型:
确定k近邻模型就是确定距离度量、k值的选择和分类决策规则三个要素,这三个要素确定了,对于任何一个新的输入实例,它所属的类别就唯一的确定了。
单元:特征空间中,对于每个训练实例点x,距离该点比其他点更近的所有点组成一个区域,叫作单元。
【可以这样理解,k近邻模型将所有的实例划分成了一个个的单元,每个单元内的实例是属于同一个类别的,当输入一个新的实例时,判断其属于哪个单元里面,然后就可以知道其所属的类别了。】
下面是对二维特征空间的划分:
2、距离度量:
我们在划分单元的时候是根据距离来划分的,特征空间中,两个点的距离越小就说明了两个点越相似。
k近邻模型可以使用欧式距离、Lp距离、Minkowski距离等。
【注:由不同的距离度量所确定的最近邻点是不同的】
3、k值的选择:
k值的选择对k近邻法的结果产生重大影响。
k值的减小就意味着整体模型变得复杂,容易发生过拟合;
k值的增大意味着整体的模型变得简答;
在实际的应用中,k值一般取一个较小的数值。通常采用交叉验证法来取最优的k值。
4、分类决策规则
有了距离的度量和k值的选择之后,就剩下分类决策规则了。如何由这k个实例的分类确定输入类别的实例,这就是分类决策规则要做的事。
上面说了,每个单元里面的实例是属于一个类别,与输入的实例最近邻的k个实例不一定全部都在一个单元里面,所以这就需要分类决策规则来确定输入实例的所属类别。
k近邻法中分类决策规则往往是多数表决,多数标准规则等价于经验风险最小化。
实现k近邻法时,主要考虑的问题是如何对训练数据集进行快速k近邻搜索,这点在特征空间维度大及训练数据容量大时尤其必要。
k近邻法最简单的实现方法是线性扫描,这时要计算输入实例与每一个训练实例的距离。当训练集很大时,非常耗时。
另一种思路是使用特殊的结构来存储训练数据,以减少计算距离的次数。常见的是kd数方法。
1、构造kd树:【递归的思想】
kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形结构。kd树是二叉树,表示对k未空间的一个划分。
下面是用递归的思想构造kd树:
算法2:
【按照我的理解就是:从第一个特征开始对k维的实例进行划分,从1开始一直到k,进行递归。如果,1~k之后还是没有进行跳出递归条件,那就再从1~k开始进行递归,知道两个子区域没有存在时停止,从而形成kd树】
2、搜索kd树:
在构造了用于存储kd树的数据结构之后,接着要考虑的就是如何去索引结点了。
下面是kd图的实例:
算法3:用kd树的最近邻搜索
下面是一个例子: