k近邻算法是一种基本的分类与回归方法。
输入为实例的特征向量,对应于特征空间上的点。输出为类别。
假设给定一个训练集,其中的实例类别已定,分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方式进行预测。
因此k近邻法没有显式的学习过程。
实际上是利于训练数据集对特征向量空间进行划分,作为其分类的模型。
k近邻法有3个基本的要素:
- k值的选取
- 距离度量
- 分类决策规则
k近邻算法
k近邻算法简单直观。
给定一个训练集,对新的输入实例,在训练集中找到k个最近邻的训练实例,这k个实例多数属于哪个类,就把该输入实例分为这个类。
k近邻模型
模型
k近邻中当训练集、距离度量、k值及分类决策规则确定后,对于任何一个新的输入实例,它所属的类比被唯一的确定。
相当于根据上面的要素将特征空间划分为一些子空间,确定子空间找那个每个点所属的类别。
距离度量
特征空间上两个实例点的距离是两个实例点相似程度的反映。
k近邻模型的特征空间一般是n维实数空间向量
R
n
R^n
Rn,使用的距离是欧式距离,但也可以是其他距离
p=2时为欧式距离。
p=1时为曼哈顿距离。
p=
∞
\infty
∞为各个坐标距离的最大值
k值的选择
k值的选择会对k近邻的结果产生重大影响。
如果选择较小的k值,相当于用较小的邻域中的训练实例进行预测。预测结果对近邻的实例点非常敏感,邻近节点一变化就会引起预测结果的变化。意味着容易发生过拟合,模型过于复杂。
如果选择较大的k值,相当于用较大的邻域中的训练实例进行预测。这时与输入实例距离较远的点(不相似)也会起作用,使预测发生错误,模型过于简单,容易欠拟合。
在应用中,k值一般先取一个比较小的数值。通常采用交叉验证来选取最优的数值。
分类决策规则
k近邻法中的分类决策规则一般采用多数表决
k近邻法的实现:kd树
实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,在特征空间维数大及训练数据容量大的时候尤其重要。
k近邻法最主要的实现方法是线性扫描。这时要计算输入实例与每一个训练实例的距离。非常耗时
为了提高效率,可以考虑特殊的结果存储训练数据。下面介绍kd树
构造kd树
kd树是一种对k维空间中的实例点进行存储以对其进行快速检索的树形结构,是二叉树,表示对k维空间的一个划分。
构造方法如下:
构造根节点,使根节点包含所有实例点的超矩形区域。通过下面的递归方法不断地对空间进行切分,生成子节点。
在超矩形区域选择一个坐标轴和在此坐标轴上的一个切分点,确定超平面垂直于坐标轴,将当期区域划分为左右两个子区域。
通常依次选择坐标轴进行切分,选择位于坐标轴的中位数为切分点。
对应的kd树
搜索kd树
kd树可以减去大部分数据点的搜索,减少搜索量。
给定一个目标点,搜索其最近邻,首先找到包含目标点的叶节点。然后从该叶节点出发,依次回退到父节点。不断查找与目标点最近的节点。当确定不可能存在更近节点时停止,这样搜索就被限制在空间的局部区域上,效率大为提高。