目录
k 近邻算法是一种基本分类与回归方法。算法的输入为实例的特征向量,即特征空间的点;输出是实例的类别,可以取多类。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式预测,可以看出 k 近邻算法不具有显示的学习过程。k 值的选择,距离度量及分类决策规则是 k 近的三个基本要素。
1. 概述
输入:训练数据集 T
输出:实例 x 所属的类 y
- 根据给定的距离度量,在 T 中找到与 x 最邻近的 k 个点,涵盖这 k 个点的 x 的邻域记作
- 在 中根据分类决策规则决定 x 的类别 y
决策规则可采用多数表决:
令 k=1 ,则得到最近邻算法,对于输入的实例点 x,最近邻将训练数据集中与 x 最近邻的点作为 x 的类。
2. 模型
当 k 近邻的三个要素确定后,对于任何一个新的输入实例,所属的类别也就唯一地确定。这相当于根据上述要素将特征空间划分为一些子空间,子空间的泪奔以及确定。
特征空间中,对每个训练实例,距离该点比其他点更近地所有点组成一个区域,这个区域叫做单元。所有训练实例点的单元构成特征空间的一个划分,每个单元的实例点的类别是确定的。
2.1 距离度量
特征空间中两个实例点的距离是两个实例点相似程度的反映。一般使用的距离是欧氏距离,也可以是更一般的 距离:
其中,
- p = 1,曼哈顿距离
- p = 2,欧氏距离
- p 无穷大,是各个坐标距离的最大值。
2.2 k 值选择
优点 | 缺点 | |
---|---|---|
较小的k值 | 只有与输入实例相似的训练实例会对预测结果起作用,近似误差较小 | 估计误差较大,预测结果对邻近点非常敏感,噪声影响很大 |
较大的k值 | 估计误差较小 | 近似误差增大 |
应用中,k 值一般取一个比较小的数值,通常采用交叉验证法来选取最优的 k 值。
2.3 分类决策规则
多数表决规则有如下解释:如果分类的损失函数为 0-1 损失函数,分类函数为
误分类的概率为
对给定的实例 x ,其最近邻的 k 个是实例点构成的集合 ,涵盖 区域的类别是 ,则误分类率是
为尽可能降低误分类率,要使 最大,所以多数表决规则等价于经验风险最小化。
3. kd 树
实现 k 近邻的算法有两种:
- 线性扫描:当训练集很大时,计算非常耗时,不可行
- kd 树:特殊结构存储数据减少计算距离的次数
kd 树时一种对 k 维空间的实例点进行存储以快速检索的树形数据结构,是二叉树。构造 kd 树相当于不断地用垂直于坐标轴的超平面将 k 维空间切分,构成一系列 k 维超矩形区域,kd 树的每一个结点对应一个超矩形区域。
3.1 构造 kd 树
输入:k维空间数据集 T
输出:kd 树
- 构造根节点,根节点对应于包含 T 的 k 维空间的超矩形区域
选择 为坐标轴,以 T 中所有实例的第一维坐标的中位数为切分点,该切分点将对应的超矩形区域切分。切分通过切分点并与坐标轴 垂直的超平面实现。
由根节点生成深度为 1 的左右子结点,左节点为第一维坐标小于切分点的数据集,右节点为第一维坐标大于切分点的数据集,将落在切分超平面上的实例点保存为根节点。
- 对深度为 j 的结点,选择 作为切分的坐标轴,切分过程如上。
- 直到两个子区域没有实例存在时停止切分。
3.2 搜索 kd 树
给定一个目标点,搜索其最近邻,首先找到包含目标点的叶结点,然后从叶结点出发依次回退到父节点,不断朝朝与目标点最邻近的结点,当确定不可能存在更近的结点时停止。
输入:kd 树, 目标点 x
输出:x 的最近邻
- 在 kd 树中找到包含 x 的叶结点:从根节点出发递归的向下访问,若目标点坐标小于切分点坐标则搜索左子树,否则搜索右子树,直到子结点为叶结点停止
- 以此叶结点为“当前最近点”
- 递归的向上回退,中途每个结点进行如下操作:
- 如果该结点保存的实例点比当前最近点距离目标点更近,则更新当前最近点
- 当前最近点一定存在于该结点一个子结点对应的区域,检查该子结点的父节点的另一子结点对应的区域是否由更近的点,如果存在则移动到另一个子结点并递归的进行最近邻搜索,否则向上回退
- 回退到根节点,搜索结束,最后的当前最近点就是 x 的最近邻点。