统计学习方法-k邻近(k-nearest neighbor)

概述

  • 是基本的回归分类模型,此处只讨论分类
  • 输入:特征向量
  • 输出:分类类别,可以为多类
  • KNN没有显示学习过程
  • KNN的三个基本要素
    • k值选择
    • 距离度量
    • 分类决策规则

模型

模型三要素:k值选择, 距离度量,分类决策规则

模型

当训练集,距离度量,k值,分类决策规则确定后,对于任何一个新的输入,其分类是确定的的。相当于这些要素间将特征空间划分为一些子空间,确定了每个子空间里每个点的类别。

特征空间中,每个训练点 x i x_i xi,距离该点比其他点更近的所有点组成的一个区域,叫做单元(cell),每个训练实例有一个单元,所有训练实例点的单元构成对特征空间的一个划分。

距离度量

一般使用欧氏距离,也可使用 L p L_p Lp距离,或Minkowski距离。

  1. L p 距 离 L_p距离 Lp
    x i , x j x_i,x_j xi,xj之间的距离是 L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i l − x j l ∣ p ) 1 p , p ≥ 1 L_p(x_i,x_j)=(\sum^n_{l=1}|x_i^{l}-x_j^{l}|^{p})^{1\over p} , p \geq 1 Lp(xi,xj)=(l=1nxilxjlp)p1,p1 p=1时,是曼哈顿距离;p=2时,是欧式距离; p = ∞ p=\infty p=时,是各个坐标距离的最大值

k值选择

k小的话,近似误差会很小,只有较接近输入的才会起作用,但估计误差会增大,对邻近的实例很敏感,如果邻近是噪声,则会出错。k小的话,模型比较复杂,易过拟合。

k值较大,减少了估计误差,但近似误差会增大。k值较大,意味着模型较简单。

一般取较小值,通过交叉验证选择最优的k值。

分类规则

常见为多数表决。
多数表决规则(majority voting rule),设损失函数为0-1损失函数,误分类的概率为 1 k ∑ x i ∈ N k ( x ) I ( y i ! = c l ) = 1 − 1 k ∑ x i ∈ N k ( x ) I ( y i = c l ) {1\over k}\sum_{x_i\in N_k(x)}I(y_i!=c_l)=1-{1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l) k1xiNk(x)I(yi!=cl)=1k1xiNk(x)I(yi=cl其中l为输入的类别,类别共k类。
要是误分类率最小即经验风险最小,就要使 1 k ∑ x i ∈ N k ( x ) I ( y i = c l ) {1\over k}\sum_{x_i\in N_k(x)}I(y_i=c_l) k1xiNk(x)I(yi=cl最大,所以多数表决规则等价于经验风险最小化

算法

对于新输入的实例,在训练集上找到与该实例最近的k个实例,这k个实例的多数属于某个类,这个行输入的实例就属于哪个类。


k邻近算法
输入:训练数据集 T = ( x 1 , y 1 ) , . . . , ( x n , y n ) T={(x_1,y_1),...,(x_n,y_n)} T=(x1,y1),...,(xn,yn),x为特征向量, y i y_i yi为类别 ∈ c 1 , c 2 , . . . , c n \in{c_1,c_2,...,c_n} c1,c2,...,cn;实例特征向量x;
输出 :实例x所属的类别y

  1. 根据给定的距离度量,在训练集T中找出与x最近的k个点,涵盖k个点的x的领域记做N(x),
  2. N k ( x ) N_k(x) Nk(x)中根据分类决策规则决定x的类别y: y = a r g m i n c 1 ∑ x i ∈ N k ( x ) I ( y i = c i ) , i = 1 , 2... , N ; j = 1 , 2 , . . , K y=argmin_{c_1} \sum _{x_i\in N_k(x)}I(y_i=c_i),i=1,2...,N;j=1,2,..,K y=argminc1xiNk(x)I(yi=ci),i=1,2...,N;j=1,2,..,K I I I为指示函数,当 ( y i = c i ) (y_i=c_i) (yi=ci) I = 1 I=1 I=1,当 ( y i ! = c i ) (y_i!=c_i) (yi!=ci) I = 0 I=0 I=0

实现 -kd树

实现k邻近,主要考虑对训练实例的k邻近的搜索,尤其在大数据量或特征维数较大时。

kd树

kd树是二叉树,表示对k维空间的一个划分。kd树的每个接单对应k维超矩形区域。

构造kd树:根节点对应整个空间,通过递归,生成子节点,划分区域。


构造平衡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 x_i=(x_i^1,x_i^2,...,x_i^k)^T xi=(xi1,xi2,...,xik)T
输出:kd树
1.构造根节点,选择 x 1 x^1 x1为坐标轴,以T中所有实例的 x 1 x^1 x1坐标的中位数为切分点,将根节点对应的超矩形空间一分为二,切分的超平面通过切分点,且与 x 1 x^1 x1轴垂直。生成两个深度为1的节点,左节点对应小于切分点的子区域,右节点对应大于切分点的区域。将落在切分超平面上的实例保存在根节点上。
2. 重复,以深度为j的节点,选择 x l x^l xl为切分的坐标轴, l = j % k + 1 l=j\%k+1 l=j%k+1,以该节点区域汇总所有实例的 x l x^l xl坐标中位数为切分点,将该区域切分成两个。
3. 直到两个区域没有实例存在,停止。


通过中位数切割,树是平衡的(两边节点相等),但树平衡不代表搜索的效率是最优的。

搜索最邻近过程

  • 从根节点出发,找到包含目标的叶子节点,以此叶子为最近点
  • 递归向上退
    • 如果该节点更近,更新最近邻
    • 当前最近一点一点存在于该节点的一个子节点对于的区域,检查该子节点的父节点的其他子节点对于的区域是否有跟接近的点。
  • 回到根节点,结束 。

kd树适合训练数据远大于空间维数时的k近邻搜索,当两者接近时,效率会下降,几乎接近线性搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值