统计学习方法笔记五---KNN(K近邻)

来源:互联网 发布:知乎日报变成读读日报 编辑:程序博客网 时间:2024/05/16 01:57

前言

k邻近算法(k-nearest)是一种判别模型,解决分类问题和回归问题,以分类问题为主,在此我们也主要介绍分类问题中的k近邻算法。

k近邻算法的输入为实例的特征向量,对应予特征空间中的点;输出为实例的类别,可以取多类,(前面我们介绍的三种方法主要是解决二分类问题)。

k近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等决策方法进行类别预测。因此,k近邻算法不具有显示的学习过程。

k近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。

算法概述

k近邻算法还是比较容易理解的,在此我们不做具体解释,后面我们只对一些细节进行说明。

直接贴图:

这里写图片描述

模型

k近邻模型实质上是一个空间划分模型。根据训练样本自身的特征,通过距离公式计算,将训练数据集组成空间整体划分成M个字空间(M为类别数)。利用测试集进行测试评估模型的好快,以调整k的选择或者距离方法的选择。在此,经常使用交叉验证的方法。

距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映。在此我们介绍一些我们经常用到的一些距离公式:

直接上图:

这里写图片描述

这里写图片描述

上图表明,不同的距离计算方法,对于同一个点(远点)计算得到的最近邻点事不同的,下面的例子也可以证明:

这里写图片描述

k值的选择

k值的选择会对k近邻算法的结果产生重大影响。

如果k值选择的较小,则会有:

1)优点:“学习”的近似误差会减小,只与输入实例较近的实例才会对预测结果起作用。2)缺点:“学习”的估计误差会增大,预测结果会对近邻的实例点非常敏感,因为k值较小,邻近点比较少(也就是说能够投票的人比较少),所以敏感(投票结果只倚重这几个人,如果这几个人都是一派人士,最终结果可想而知了)。如果邻近的实例点恰巧是噪音,预测就会出错。

k值的减小意味着整体模型变得比较复杂(划分较多),容易发生过拟合。

如果选择的k值较大,则会有:

1)优点:可以减少学习的估计误差,因为能够投票的人数较多,更具有说服力,所以投票结果会比较符合实际情况(预测误差较小)。2)缺点:增大了近似误差。因为投票的人多了,每个人都会有投票误差,所以总误差就会增大。这时候,与输入实例比较远的(不相似的)训练实例也会对预测结果起作用,使得预测发生错误。

k值的增大意味着模型变得简单。如果k=N,那么无论输入什么,都将简单的预测它属于在训练实例中最多的类,(此时,我想到一个词,人多势众)。这个时候,模型过于简单,完全忽略了实例中大量的有用信息,只考虑了类别数量,这是不可取的。

分类决策规则

k近邻算法中的分类决策规则往往是多数表决,即由输入实例的k个近邻的训练实例中的多数类决定输入实例的类别。

这里写图片描述

kd树

实现k近邻算法的时候,主要考虑的问题是如何对训练数据进行快速k近邻搜索,这点在特征空间的维数大以及训练数据容量大的时候,很重要!

k近邻算法最简单的实现方法是线性扫描(linear scan),这时候需要计算输入实例与每一个训练实例的距离,当训练集很大的时候,计算非常耗时,这种方法是不可行的。

为了提高k近邻搜索的效率,可以考虑使用特殊的结构和存储训练数据,以减少计算距离的次数,具体的方法很多,kd树便是其中的一种,其思路还是比较简单易理解的。我不打算在此复述。

kd树是二叉树,表示对k维空间的一个划分(partition).构造kd树相当于不断地使用垂直于坐标轴的超平面将k维空间切分,构造一系列的k维超矩形区域。kd树的每一个节点对应于一个k维超矩形区域

直接贴图:
这里写图片描述
这里写图片描述

给出实例,加深理解:

这里写图片描述
这里写图片描述

最终形成的kd树为:

这里写图片描述

kd搜索

根据上一部分构造出的kd树,进行搜索获得k近邻节点,利用kd树可以省去对大部分数据点的搜索,不需要一一计算进行比较,从而减少计算量,提高算法效率。

以最近邻为例(k=1),给定一个目标点,搜索其最近邻。首先找到包含目标点的叶节点(最小的包含目标点的超矩形区域);然后从该叶节点出发,依次回退到父节点;不断查找与目标节点最邻近的节点,当确定不可能存在更近的节点时终止。这样搜索就被限制在空间的局部区域上,效率大为提高。

在此直接贴图:
这里写图片描述
这里写图片描述

给出例子,加深理解:

这里写图片描述

《完》

所谓的不平凡就是平凡的N次幂。                       -------By Ada
原创粉丝点击