ch03: k近邻法
k 近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法.本书只讨论分类问题中的 k 近邻法
- k 近邻法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类.
- k 近邻法假设给定一个训练数据集,其中的实例类别已定.分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测.因此, k 近邻法不具有显式的学习过程.
- k 近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”.
- k值的选择、距离度量及分类决策规则是k 近邻法的三个基本要素.
1. k近邻算法
k 近邻算法简单、直观:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类.
-
输入:训练数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N\} T={(x1,y1),(x2,y2),...,(xN,yN}其中 x i x_i xi为实例的特征向量, y i y_i yi为实例的类别;实例特征向量 x
-
输出:实例 x 所属的类 y
-
步骤:
(1)根据给定的距离度量,在训练集 T 中找出与 x 最邻近的 k 个点,涵盖这 k 个点的 x 的邻域记作 N k ( x ) N_k(x) Nk(x) ;
(2)在 N k ( x ) N_k(x) Nk(x)中根据分类决策规律(如多数表决)决定 x 的类别 y -
k 近邻法的特殊情况是 k=1的情形,称为最近邻算法.
2. k近邻模型
k 近邻法使用的模型实际上对应于对特征空间的划分.模型由三个基本要素——距离度量、 k 值的选择和分类决策规则决定.
模型
- 特征空间中,对每个训练实例点,距离该点比其他点更近的所有点组成一个区域,叫作单元cell
- 每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分.
- 最近邻法将实例 xi 的类 yi 作为其单元中所有点的类标记(class label).
距离度量
- 特征空间中两个实例点的距离是两个实例点相似程度的反映
- k 近邻模型的特征空间一般是n 维实数向量空间 R^n.使用的距离是欧氏距离,但也可以是其他距离,如更一般的 Lp距离(Lp distance)或 Minkowski 距离(Minkowski distance).
k值的选择
- k值较小:相当于用较小的领域中的训练实例进行预测
- “学习”的近似误差(approximation error) 会减小,只有与输入实例较近的(相似的)训练实例才会对预测结果起作用
- 但缺点是“学习”的估计误差(estimation error) 会增大,预测结果会对近邻的实例点非常敏感
- 换句话说,k 值的减小就意味着整体模型变得复杂,容易发生过拟合.
- k值较大:相当于用较大的领域中的训练实例进行预测
- 其优点是可以减少学习的估计误差.但缺点是学习的近似误差会增大.
- 这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误.
- k 值的增大就意味着整体的模型变得简单,如果 k=N,那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类.这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的
- 因此,在应用中,k 值一般取一个比较小的数值.通常采用交叉验证法来选取最优的 k 值.
分类决策规则
k 近邻法中的分类决策规则往往是多数表决,即由输入实例的 k 个邻近的训练实例中的多数类决定输入实例的类
- 多数表决规则等价于经验风险最小化.
3. k近邻法的实现:kd树
实现 k 近邻法时,主要考虑的问题是如何对训练数据进行快速 k 近邻搜索.这点在特征空间的维数大及训练数据容量大时尤其必要.最简单的实现方法是线性扫描(linear scan).但是非常耗时,为了提高k 近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数.
构造平衡kd树
- 输入: k 维空间数据集
T
=
{
x
1
,
x
2
,
…
,
x
N
}
T=\{x_1,x_2,…,x_N\}
T={x1,x2,…,xN}
其中 x i = { x i ( 1 ) , x i ( 2 ) , … , x i ( k ) } T , i = 1 , 2 , . . . N x_i=\{x^{(1)}_i,x^{(2)}_i,…,x^{(k)}_i\}^T,i=1,2,...N xi={xi(1),xi(2),…,xi(k)}T,i=1,2,...N - 输出: kd树
- 步骤:
- 开始: 构造根结点,对应于包含 T 的 k 维空间的超矩形区域
(1)选择为坐标轴,以T 中所有实例的 x ( 1 ) x^{(1)} x(1) 坐标的中位数 为切分点,将根结点对应的超矩形区域切分为两个子区域.切分由通过切分点并与坐标轴 x ( 1 ) x^{(1)} x(1)垂直的超平面实现.
(2)由根结点生成深度为1的左、右子结点:左子结点对应坐标 x ( 1 ) x^{(1)} x(1) 小于切分点的子区域,右子结点对应于坐标 x ( 1 ) x^{(1)} x(1)大于切分点的子区域.
(3)将落在切分超平面上的实例点保存在根结点. - 重复:
(1)对深度为 j 的结点,选择 x ( l ) x^{(l)} x(l) 为切分的坐标轴, l = j ( m o d k ) + 1 l=j(mod k)+1 l=j(modk)+1 ,
以该结点的区域中所有实例的 x ( l ) x^{(l)} x(l) 坐标的中位数为切分点,将该结点对应的超
矩形区域切分为两个子区域.切分由通过切分点并与坐标轴 x^{(l)} 垂直的超平面
实现.
(2)由根结点生成深度为 j+1 的左、右子结点:左子结点对应坐标 x ( l ) x^{(l)} x(l) 小于切分点的子区域,右子结点对应于坐标 x ( l ) x^{(l)} x(l)大于切分点的子区域.
(3)将落在切分超平面上的实例点保存在该结点. - 结束: 直到两个子区域没有实例存在时停止.从而形成 kd 树的区域划分.
- 开始: 构造根结点,对应于包含 T 的 k 维空间的超矩形区域
搜索kd树
- 输入: 已构造的 kd 树;目标点 x;
- 输出: x 的最近邻
- 步骤:
(1)在 kd 树中找出包含目标点 x 的叶结点:从根结点出发,递归地向下访问 kd 树.若目标点 x 当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点.直到子结点为叶结点为止
(2)以此叶结点为“当前最近点”.
(3)递归地向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点“
(b)检查该子结点的父结点的另一子结点对应的区域是否有更近的点.如果有,移动到另一个子结点.接着,递归地进行最近邻搜索;如果没有,向上回退.
(4)当回退到根结点时,搜索结束.最后的“当前最近点”即为 x 的最近邻点.