第三章 k近邻法

参考资料:

1.李航《统计学习方法》
2.github: https://github.com/fengdu78/lihang-code

k k k近邻方法(k-nearest neighbor,KNN)是一种基本的分类与回归的方法. k k k近邻法的输入为实例的特征向量,对应于特征空间的点;
输出为实例的类别,可取多类. k k k近邻法假设给定一个训练数据集,其中的实例类别已定,分类时,对于新的实例,根据其 k k k个最近邻的
训练实例的类别,通过多数表决等方式进行预测

k k k近邻法不具有显示的学习过程,k值的选择、距离度量以及分类决策规则 k k 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 ∈ χ ⊆ R n 为 实 例 的 特 征 向 量 , y ∈ Y = { c 1 , c 2 , . . . , c K } 为 实 例 的 类 别 , i = 1 , 2 , . . , N x_{i}\in \chi \subseteq R^{n}为实例的特征向量, y\in Y =\{c_{1},c_{2},...,c_{K}\}为实例的类别,i=1,2,..,N xiχRn,yY={c1,c2,...,cK}i=1,2,..,N; 实例特征向量 x x x.

输出: 实例 x x x的所属类 y y y.

(1)根据给定的距离度量,在训练集 T T T中找出与 x x x最邻近的 k k k的点,涵盖这 k k k个点的 x x x邻域记作 N k ( x ) N_{k}(x) Nk(x);

(2)在 N k ( x ) N_{k}(x) Nk(x)中根据分类决策规则,如多数表决,决定 x x x的类别 y y y:
y = a r g max ⁡ c j ∑ x i ∈ N k ( x ) I ( y i = c j ) , i = 1 , 2 , 3 , . . . N ; j = 1 , 2 , . . . , K . y=arg\max \limits_{c_{j}}\sum _{x_{i}\in {N_{k}(x)}} I(y_{i}=c_{j}) ,i=1,2,3,...N;j=1,2,...,K. y=argcjmaxxiNk(x)I(yi=cj),i=1,2,3,...N;j=1,2,...,K.
其中 I I I为指示函数,即当 y i = c j 时 , I = 1 , 否 则 , I = 0 y_{i}=c_{j}时,I=1,否则,I=0 yi=cjI=1,I=0

k = 1 k=1 k=1时,称为最近邻算法,对于输入的实例点 x x x,最近邻法将训练数据集中与 x x x最邻近的点的类作为 x x x的分类。

k k k近邻法的模型对应于特征空间的一个划分

距离度量

特征空间中两个实例点的距离是两个实例点相似程度的反映

设特征空间 χ 是 n 为 实 数 向 量 空 间 R n , x i , x j ∈ χ , x i = ( x i 1 , x i 2 , . . . , x i n ) T , x j = ( x j 1 , x j 2 , . . . , x j n ) T \chi是n为实数向量空间R^{n},x_{i},x_{j}\in \chi, x_{i}=(x_{i}^{1},x_{i}^{2},...,x_{i}^{n})^T,x_{j}=(x_{j}^{1},x_{j}^{2},...,x_{j}^{n})^T χnRn,xi,xjχ,xi=(xi1,xi2,...,xin)T,xj=(xj1,xj2,...,xjn)T, x i , x j 的 L p 距 离 定 义 为 : x_{i},x_{j}的L_{p}距离定义为: xi,xjLp

L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i l − x j l ∣ p ) 1 p L_{p}(x_{i},x_{j})=(\sum_{l=1}^n{|x_{i}^{l}-x_{j}^{l}|^p})^{\frac 1p} Lp(xi,xj)=(l=1nxilxjlp)p1

这里 p ≥ 1. 当 p = 2 时 , 称 为 欧 式 距 离 , p = 1 时 , 称 为 曼 哈 顿 距 离 , 当 p = inf ⁡ 时 , 它 是 各 个 坐 标 距 离 的 最 大 值 p \geq 1.当p=2时,称为欧式距离,p=1时,称为曼哈顿距离,当p=\inf 时,它是各个坐标距离的最大值 p1.p=2p=1p=inf

L inf ⁡ ( x i , x j ) = max ⁡ l ∣ x i l − x j l ∣ ) L_{\inf}(x_{i},x_{j})=\max_{l}{|x_{i}^{l}-x_{j}^{l}|}) Linf(xi,xj)=lmaxxilxjl)

k k k值的选择

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

如果选择较小的 k k k值就相当于用较小的邻域中的训练实例进行预测,学习的近似误差会减小,但是学习的估计误差会增大,预测结果会对邻近的实例点非常敏感,如果临近点恰好是噪声,预测就会出错

如果选择较大的 k k k值,就相当于用较大邻域中的训练实例进行预测,学习的近似误差会增大,但是学习的估计误差会减小,这时与输入实例较远的训练实例也会对预测起作用,使预测出错

k k k值的增大意味着模型整体变得简单,如果 k = N k=N k=N,那么无论输入实例是什么,都将简单地预测他属于训练实例中最多的类

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

分类决策规则

误分类率是
1 k ∑ x i ∈ N k ( x ) I ( y i ̸ = c j ) = 1 − 1 k ∑ x i ∈ N k ( x ) I ( y i = c j ) \frac{1}{k}\sum_{x_{i}\in N_{k}(x)}I(y_{i}\not= c_{j}) = 1-\frac{1}{k}\sum_{x_{i}\in N_{k}(x)}I(y_{i} = c_{j}) k1xiNk(x)I(yi̸=cj)=1k1xiNk(x)I(yi=cj)
要使得误分类类别最小,即经验风险最小,就要使 1 k ∑ x i ∈ N k ( x ) I ( y i = c j \frac{1}{k}\sum_{x_{i}\in N_{k}(x)}I(y_{i} = c_{j} k1xiNk(x)I(yi=cj最大,所以多数表决规则等价于经验风险最小化

k k k近邻法的实现 k d kd kd

主要考虑问题:如何对训练数据进行快速的 k k k近邻搜索

k k k近邻最简单的实现方法就是线性扫描,但当训练集很大时,计算非常耗时

考虑使用特殊的结构存储训练数据,以减少计算距离的次数

k d 树 kd树 kd :是一种对 k k k维空间中的实例点进行存储一遍对其进行快速检索的树形数据结构, k d kd kd树是二叉树,表示对 k k k维空间的一个划分

算法(构造平衡 k d kd kd树)

输入: k 维 空 间 数 据 集 T = { x 1 , x 2 , . . . , x N } , 其 中 x i = ( x i ( 1 ) , x i ( 2 ) , . . . , x i ( k ) ) T k维空间数据集T=\{x_{1},x_{2},...,x_{N}\},其中x_{i}=(x_{i}^{(1)},x_{i}^{(2)},...,x_{i}^{(k)})^T kT={x1,x2,...,xN}xi=(xi(1),xi(2),...,xi(k))T
输出: k d kd kd

(1)开始:构造根节点,以根节点对应于包含T的 k k k维空间的超矩形区域,选择 x ( 1 ) x^{(1)} x(1)为坐标轴,以 T T T中所有实例的 x ( 1 ) x^{(1)} x(1)坐标的中位数为切分点,,由根节点生成深度为1的左右子节点,左边小于 x ( 1 ) x^{(1)} x(1),右边大于 x ( 1 ) x^{(1)} x(1)

(2)重复,对深度为 j j 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)坐标的中位数为切分点,将结点对应的超平面矩形区域切分成两个子区域;

(3)直到两个子区域没有实例存在时停止.

example

根据训练集
T = { ( 2 , 3 ) T , ( 5 , 4 ) T , ( 9 , 6 ) T , ( 4 , 7 ) T , ( 8 , 1 ) T , ( 7 , 2 ) T } T=\{(2,3)^T,(5,4)^T,(9,6)^T,(4,7)^T,(8,1)^T,(7,2)^T\} T={(2,3)T,(5,4)T,(9,6)T,(4,7)T,(8,1)T,(7,2)T}
构造平衡 k d kd kd

解:取 x ( 1 ) x^{(1)} x(1)的数值,进行从小到大排序:2,4,5,7,8,9,选取中位数7,以(7,2)为根节点将数据分成两类:(2,3),(5,4),(4,7)和(8,1),(9,6),对左子树再次取 l = 1 m o d 2 + 1 = 2 , x ( 2 ) l=1mod2 +1 =2,x^{(2)} l=1mod2+1=2,x(2)的数值,从小到大排序:3,4,7选择中位数4,则左边构造完毕,对右子树取 x ( 2 ) x^{(2)} x(2)的数值:1,6,取6作为中位数,则右子树构造完毕.

算法 (用 k d kd kd树进行最近邻搜索)

输入:已知构造的 k d kd kd树;目标点 x x x
输出: x x x的最近邻

(1)在 k d kd kd树中找到包含目标点 x x x的叶节点:从根节点出发,递归地向下访问 k d kd kd树,若目标点当前为的坐标小于切分点坐标,则移动到左子树,否则右子树,直到子结点为叶结点为止
(2)以此叶节点为当前最近点
(3)递归地向上回退
(a)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为当前最近点;
(b)当前最近点一定存在于该节点一个子结点对应的区域,检查该子结点的父节点的另一子结点对应的区域是否有更近的点
(4)当回退到根结点时,搜索结束,最后的当前最近点,就是 x x x的最近邻点

如果实例点是随机分布的, k d kd kd树搜索的平均计算复杂度为 O ( l o g N ) O(logN) O(logN)
kd树更适用于训练是实例数远大于空间维数的k近邻搜索

example

T = { ( 2 , 3 ) T , ( 5 , 4 ) T , ( 9 , 6 ) T , ( 4 , 7 ) T , ( 8 , 1 ) T , ( 7 , 2 ) T } T=\{(2,3)^T,(5,4)^T,(9,6)^T,(4,7)^T,(8,1)^T,(7,2)^T\} T={(2,3)T,(5,4)T,(9,6)T,(4,7)T,(8,1)T,(7,2)T}构造的平衡 k d kd kd树为例,求出 x = ( 3 , 4.5 ) x=(3,4.5) x=3,4.5的最近邻点

解:假设(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)对应的点表示为A,B,C,…,F, 则构造的平衡二叉树的先序遍历和中序遍历分别为:FBADCE,ABDFEC.

1.从根节点(7,2)出发,找出(3,4.5)对应的第一个最近点(4,7)

2.分别计算(4,7)的父节点(5,4)与(4,7)分别距离(3,4.5)的距离(采用欧式距离),更新(5,4)为当前最近点

3.计算(2,3)对应的区域是否与(5,4)为中心,(5,4)与(3,4.5)之间的距离为半径的超球体相交,发现相交, 计算(2,3)到(3,4.5)的距离,更新(2,3)为当前最近邻点

4.搜索结束,(2,3)为最近邻点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值