第三章 k近邻法


k近邻法(k-nearnest neighbor, K-NN)是一种基本分类与回归方法.

  • 对于输入的实例,k近邻法通过多数表决等方式进行预测,故其不具有显式的学习过程;
  • 三个基本要素是:K值的选择、距离度量及分类决策准则.

3.1 k近邻算法

算法 3.1(k近邻法)
输入: 训练数据集
T=(x1,y1),(x2,y2),...,(xN,yN)T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}
其中,xiXRnx_i \in X \subseteq \mathbb{R}^n 为实例的特征向量,yiY=c1,c2,...,cky_i \in Y = {c_1,c_2,...,c_k} 为实例的类别,i=1,2,...,Ni=1,2,...,N , 实例特征向量xx.
输出: 实例xx所属的类yy.
(1) 根据给定的距离度量,在训练集TT中找出与xx最邻近的kk个点,涵盖这个点的xx的邻域记作Nk(x)N_k(x):
(2) 在Nk(x)N_k(x)中根据分类规则(如多数表决)决定xx的类别yy

y=argmaxcjxiNk(x)I(yi=cj),i=1,2,...,N;j=1,2,...,Ky=arg \max \limits_{c_j} \sum \limits_{x_i \in N_k(x)}I(y_i=c_j), i=1,2,...,N; j=1,2,...,K
其中,II为指示函数,即当 yi=cjy_i=c_jI=1I=1,否则I=0I=0.

3.2 k近邻模型

k近邻法使用的模型实际上对应于特征空间的划分

3.2.1 模型

  • k近邻法中,当其三要素基本确定后,对于一个新的输入实例,它所属的类唯一地确定.

  • k近邻法分类类似于将特征空间划分为一些子空间,确定子空间的每个点所属的类

统计学习笔记-第三章 k邻近法

3.2.2 距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映.距离计算有以下几种方法:

  • 欧氏距离
  • LpL_p距离(LpL_p distance)
  • Minkowski距离(Minkowski distance)

LpL_p距离

Lp(xi,xj)=(l=1nxi(l)xj(l)p)1p,(p1)L_p(x_i,x_j)=(\sum \limits_{l=1}^n |x_i^{(l)}-x_j^{(l)}|^p)^{\frac{1}{p}},(p \geq 1)

  • p=2p=2时,称为欧氏距离(Euclidean distance)
  • p=1p=1时,称为曼哈顿距离(Manhattan distance)
  • p=p=\infty时,它是各个坐标距离的最大值

3.2.3 K值的选择

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

  • k值较小,相当于选择较小的邻域中的训练实例进行预测,学习的近似误差(approximation error)会减小,但是估计误差(estimation error)会增大.即k值的减小就意味着整体模型变的复杂,容易发生过拟合;
  • k值较大,相当于用较大的训练实例进行预测,可以减少学习的估计误差,但是近似误差会增大.即k值的增大意味着整体的模型变的简单.

在应用中,k值一般取一个比较小的数值.通常采用交叉验证法来选取最优的k值.

3.2.4 分类决策规则

一般是多数表决,即由输入实例的k个邻近的训练实例中的多数类决定输入实例的类.
统计学习笔记-第三章 k邻近法

3.3 k近邻法的实现:kd树

实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索

  • 简单地实现方法是线性扫描(linear scan),计算输入实例与每一个训练实例的距离. 在训练集很大时,计算十分耗时
  • kdkd 树(kdkd tree)方法

3.3.1 构造kdkd

kdkd 树是一种对kk维空间中的空间进行存储以便对其进行快速检索的树形数据结构,是一种二叉树

构造 kdkd 树的算法如下所示:

算法3.2 (构造平衡kdkd树)
输入: kk 维空间数据集T=x1,x2,...,xNT={x_1,x_2,...,x_N}, 其中x1=(xi(1),xi(2),...,xi(k)),i=1,2,...,Nx_1=(x_i^{(1)},x_i^{(2)},...,x_i^{(k)}), i=1,2,...,N
输出: kdkd
(1) 开始:构造根节点,根节点对应于包含 TTkk 维空间的矩形区域.
选择 x(i)x^{(i)} 为坐标轴,以 TT 中所有实例的 x(i)x^{(i)} 坐标的中位数为切分点,将根节点对应的超矩形区域切分为两个子区域.切分由通过切分点并与坐标轴 x(i)x^{(i)} 垂直的超平面实现.
由根节点生成深度为1的左、右子节点;左子节点对应坐标 x(l)x^{(l)} 小于切分点的子区域,右子节点对应与坐标 x(i)x^{(i)} 大于切分点的值区域.
将落在切分超平面上的实例点保存在根节点.

(2) 重复:对深度为jj的结点,选择x(i)x^{(i)} 为切分的坐标轴,l=j(modk)+1l=j(mod k)+1,以该结点的区域中所有实例的x(i)x^{(i)} 坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域.切分由通过切分点并与坐标轴x(i)x^{(i)} 垂直的超平面实现.
由该结点生成深度为j+1j+1的左、右子结点,左子结点对应于坐标x(i)x^{(i)}小于切分点的子区域,右子结点对应坐标x(i)x^{(i)}大于切分点的子区域.
将落在切分超平面上的实例点保存在该结点.
(3) 直到两个子区域没有实例存在时停止,从而形成kdkd树的区域划分.

3.3.2 搜索 kdkd

使用kdkd树可以省去对大部分数据点的搜索,从而减少搜索的计算量.

统计学习笔记-第三章 k邻近法统计学习笔记-第三章 k邻近法

相关文章: