机器学习理论《统计学习方法》学习笔记:第三章 k近邻法

  • 3 k近邻法
    • 3.1 K近邻算法
    • 3.2 K近邻模型
      • 3.2.1 模型
      • 3.2.2 距离度量
      • 3.2.3 K值的选择
      • 3.2.4 分类决策规则
    • 3.3 K近邻法的实现:kd树
      • 3.3.1 构造kd树
      • 3.3.2 搜索kd树
    • 本章概要

3 k近邻法

  • K近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。K近邻法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。
  • K近邻法假设给定一个数据集,其中的实例类别已定。分类时,对新的实例,根据其K个最邻近实例的类别,通过多数表决等方式进行预测。因此,K近邻法不具有显式的学习过程。
  • K近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的模型。K值的选择、距离度量、及分类决策规则是K邻近法的三个基本要素。

3.1 K近邻算法

  • K近邻算法简单、直观:给定一个训练数据集,对新的输入实例,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分为这个类。

K近邻法
输入:训练数据集T={(x1,y1),(x2,y2),⋯,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}T={(x1​,y1​),(x2​,y2​),⋯,(xN​,yN​)},其中 xi∈X⊆Rnx_i\in X \subseteq R^nxi​∈X⊆Rn,为实例的特征向量,yi∈Y={c1,c2,⋯,ck}y_i\in Y=\{c_1,c_2,\cdots,c_k\}yi​∈Y={c1​,c2​,⋯,ck​}为实例的类别,i=1,2,⋯,Ni=1,2,\cdots,Ni=1,2,⋯,N;实例特征向量x。
输出:实例x所属的类y。
(1)根据给定的距离度量,在训练集 TTT 中找出与x最邻近的K个点,涵盖这K个点的x的领域记作Nk(x)N_k(x)Nk​(x).
(2)在Nk(x)N_k(x)Nk​(x)中根据分类决策规则(如多数表决)决定x的类别y:y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,Ky=arg\space max_{c_j}\sum_{x_i\in N_k(x)}I(y_i=c_j),i=1,2,\cdots,N;j=1,2,\cdots,Ky=arg maxcj​​xi​∈Nk​(x)∑​I(yi​=cj​),i=1,2,⋯,N;j=1,2,⋯,K,III为指示函数,即当yi=cjy_i=c_jyi​=cj​时III为1,否则 III 为 000.

  • K近邻法的特殊情况是k=1k=1k=1的情形,称为最近邻算法。对于输入的实例点(特征向量)x,最近邻法将训练数据集中与x最邻近点的类作为x的类。
  • K近邻法没有显式的学习过程。

3.2 K近邻模型

K近邻法使用的模型实际上对应于特征空间的划分,模型由三个基本要素:距离度量、K值得选择、分类决策规则决定。

3.2.1 模型

  • K近邻法中,当训练集、距离度量(如欧式距离)、K值及分类决策规则(如多数表决)确定后,对于任何一个新的输入实例,它所属的类唯一的确定。这相当于根据上述要素将特征空间划分为一些子空间,确定子空间里每个点所属的类。
  • 特征空间中,对每个训练实例点xix_ixi​,距离该点比其他点更近的所有点组成的一个区域,叫做单元(cell)。每个训练实例点拥有一个单元,所有训练实例点的单元构成对特征空间的一个划分。最近邻法将实例xix_ixi​的类yiy_iyi​作为其单元中所有点的类标记(Class Label)。这样,每个单元的实例点的类别是确定的。
  • K近邻法的模型对应特征空间的一个划分。

3.2.2 距离度量

  • 特征空间中两个实例点的距离是两个实例点相似度的反映。K近邻模型的特征空间一般是n为实数向量空间RnR^nRn。使用的距离是欧式距离,也可以是其他距离,如更一般的LpL_pLp​距离或者Minkowshi距离。
  • 设特征空间XXX是n维实数向量空间RnR^nRn,xi,xj∈X,xi=(xi(1),xi(2),⋯,xi(n))T,xj=(xj(1),xj(2),⋯,xj(n))Tx_i,x_j\in X,x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^T,x_j=(x_j^{(1)},x_j^{(2)},\cdots,x_j^{(n)})^Txi​,xj​∈X,xi​=(xi(1)​,xi(2)​,⋯,xi(n)​)T,xj​=(xj(1)​,xj(2)​,⋯,xj(n)​)T,xi,xjx_i,x_jxi​,xj​的LpL_pLp​的距离定义为:Lp(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣p)1pL_p(x_i,x_j)=(\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|^p)^{1\over p}Lp​(xi​,xj​)=(l=1∑n​∣xi(l)​−xj(l)​∣p)p1​这里p≥1p\ge 1p≥1。
  • 当p=2p=2p=2时,称为欧式距离,即L2(xi,xj)=(∑l=1n∣xi(l)−xj(l)∣2)12L_2(x_i,x_j)=(\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|^2)^{1\over 2}L2​(xi​,xj​)=(l=1∑n​∣xi(l)​−xj(l)​∣2)21​
  • 当p=1p=1p=1时,称为曼哈顿距离,即L1(xi,xj)=∑l=1n∣xi(l)−xj(l)∣L_1(x_i,x_j)=\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|L1​(xi​,xj​)=l=1∑n​∣xi(l)​−xj(l)​∣
  • 当p=∞p=\inftyp=∞时,是各个坐标距离的最大值,即L∞(xi,xj)=maxl∣xi(l)−xj(l)∣L_{\infty}(x_i,x_j)=max_l|x_i^{(l)}-x_j^{(l)}|L∞​(xi​,xj​)=maxl​∣xi(l)​−xj(l)​∣
  • 二维空间中,P不同取值时,与原点的LpL_pLp​距离为1(Lp=1)1(L_p=1)1(Lp​=1)的点的图形。

3.2.3 K值的选择

  • K值的选择对K近邻法的结果产生重大影响。
  • 如果选择较小的K值,就相当于较小的邻域中的训练实例进行预测,学习的近似误差会减小,只有与输入实例较近的(相似的)训练实例才会对预测实例起作用。但缺点是学习的估计误差会增大,预测结果会对近邻的实例点非常敏感。如果邻近的实例点恰巧是噪声,预测就会出错。换句话说,K值的减小意味着整体模型变得复杂,容易发生过拟合。
  • 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测。其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,使预测发生错误。K值的增大就意味着整体的模型变得简单。
  • 如果K=N,那么无论输入实例是什么,都将简单的预测它属于在训练实例中最多的类。这时,模型过于简单,完全忽略训练实例中的大量有用信息,是不可取的。
  • 在应用中,K值一般取一个比较小的数值。通常采用交叉验证法来选取最优的K值。

3.2.4 分类决策规则

  • K近邻法中的分类决策规则往往是多数表决,即由输入实例的K个邻近的训练实例中的多数类决定输入实例的类。
  • 多数表决规则有如下解释:如果分类的损失函数为0-1损失函数,分类函数为f:Rn→{c1,c2,⋯,ck}f:R^n\to \{c_1,c_2,\cdots,c_k\}f:Rn→{c1​,c2​,⋯,ck​}那么误分类的概率是P(Y≠f(X))=1−P(Y=f(X))P(Y\neq f(X))=1-P(Y=f(X))P(Y​=f(X))=1−P(Y=f(X))对给定的实例x∈Xx\in Xx∈X,其最近邻的K个训练实例点构成集合Nk(x)N_k(x)Nk​(x).
  • 如果涵盖Nk(x)N_k(x)Nk​(x)的区域的类别是cjc_jcj​,那么误分类率是1k∑xi∈Nk(x)I(yi≠cj)=1−1k∑xi∈Nk(x)I(yi=cj){1\over k}\sum_{x_i\in {N_k(x)}}I(y_i\neq c_j)=1-{1\over k}\sum_{x_i\in {N_k(x)}}I(y_i= c_j)k1​xi​∈Nk​(x)∑​I(yi​​=cj​)=1−k1​xi​∈Nk​(x)∑​I(yi​=cj​)
    要使误分类最小即经验风险最小,就要使1k∑xi∈Nk(x)I(yi=cj){1\over k}\sum_{x_i\in {N_k(x)}}I(y_i= c_j)k1​xi​∈Nk​(x)∑​I(yi​=cj​)最大,所以多数表决规则等价于经验风险最小化。

3.3 K近邻法的实现:kd树

  • 实现k近邻法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索,在特征空间的维数大,及训练数据容量大时尤为重要。
  • K近邻法最简单的实现方法就是线性扫描。这时要计算输入实例与每一个实例的距离,当训练集很大时,计算非常耗时,这种方法是不可行的。
  • 为了提高K近邻搜索的效率,可以考虑使用特殊的结构存储训练数据,以减少计算距离的次数。具体方法有很多,下面介绍其中的kd树方法。

3.3.1 构造kd树

  • kd树是一种对k维空间中的实例点进行存储,以便对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维空间的一个划分(partition)。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。
  • 构造kd树的方法如下:构造根节点,使根节点对应于K维空间中,包含所有实例点的超矩形区域;通过下面的递归方法,不断地对K维空间进行切分,生成子结点。在超矩形区域(结点)上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个超平面通过选定的切分点并垂直于选定的坐标轴,将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域,这个过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
  • 通常,依次选择坐标轴对空间切分,选择训练实例点在选定坐标轴上的中位数为切分点,这样得到的kd树是平衡的。注意,平衡的kd树搜索时的效率未必是最优的。

构造平衡kd树
输入:k维空间数据集T={x1,x2,⋯,xN}T=\{x_1,x_2,\cdots,x_N\}T={x1​,x2​,⋯,xN​}其中xi=(xi(1),xi(2),⋯,xi(k))T,i=1,2,⋯,Nx_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(k)})^T,i=1,2,\cdots,Nxi​=(xi(1)​,xi(2)​,⋯,xi(k)​)T,i=1,2,⋯,N
输出:kd树
(1)开始:

  • 构造根结点,根结点对应于包含TTT的k维空间的超矩形区域。
  • 选择x(1)x^{(1)}x(1)为坐标轴,以TTT中所有实例的x(1)x^{(1)}x(1)坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴x(1)x^{(1)}x(1)垂直的超平面实现。
  • 由根节点生成深度为1的左右子结点:左子结点对应坐标x(1)x^{(1)}x(1)小于切分点的子区域,右子结点对应于坐标x(1)x^{(1)}x(1)大于切分点的子区域。
  • 将落在切分超平面上的实例点保存在根结点。

(2)重复:

  • 对深度为jjj的结点,选择x(l)x^{(l)}x(l)为切分的坐标轴,l=j(modk)+1l=j(mod\space k)+1l=j(mod k)+1,以该结点的区域中所有实例的x(l)x^{(l)}x(l)坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴x(l)x^{(l)}x(l)垂直的超平面实现。
  • 由该结点生成深度为j+1j+1j+1的左、右子节点:左子结点对应坐标x(l)x^{(l)}x(l)小于切分点的子区域,右子结点对应坐标x(l)x^{(l)}x(l)大于切分点的子区域。

(3)直到两个子区域没有实例存在时停止。从而形成kd树的区域划分。

3.3.2 搜索kd树

如何利用kd树进行k近邻搜索?

  • 利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
  • 给定一个目标点,搜索其最近邻。首先找到包含目标点的叶结点。然后从叶结点出发,依次回退到父结点,不断查找与目标点最邻近的结点,当确定不可能存在更近的结点时终止。这样的搜索就被限制在空间的局部区域上,效率大为提高。
  • 包含目标点的叶结点对应包含目标点的最小超矩形区域。以此叶结点的实例点作为当前最近点。目标点的最近邻一定在以目标点为中心,并通过当前最近点的超球体的内部。然后返回当前结点的父结点,如果父结点的另一子结点的超矩形区域与超球体相交,那么在相交的区域内寻找与目标点更接近的实例点。如果存在这样的点,将此点作为新的当前最近点。算法转到更上一级的父结点,继续上述过程。如果父结点的另一子结点的超矩形区域与超球体不相交,或不存在比当前最近点更近的点,则停止搜索。

用kd树的最近邻搜索
输入:已构造的kd树,目标点x;
输出:x的最近邻;
(1)在kd树中找出包含目标点x的叶结点:从根结点出发,递归地向下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点。直到子结点为叶结点为止。
(2)以此叶结点“当前最近点”。
(3)递归地向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标更近,则以该实例点为当前最近点
(b)当前最近点一定存在于该结点一个子结点对应的区域。检查该子结点的父结点的另一子结点对应的区域是否有更近的点。具体地,检查另一子结点对应的区域是否与以目标点为球心、以目标点与当前最近点间的距离为半径的超球体相交。
如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点。接着,递归地进行最近邻搜索。
如果不相交,向上回退。
(4)当回退到根结点时,搜索结束。最后的当前最近点即为x的最近邻点。

  • 如果实例点是随机分布的,kd树搜索的平均计算复杂度是O(logN)O(log\space N)O(log N),这里NNN是训练实例数。kd树更适用于训练实例数远大于空间维数时的k近邻搜索。当空间维数接近训练实例数时,它的效率会迅速下降,几乎接近线性扫描。

本章概要

  1. k近邻法是基本且简单的分类与回归方法。k近邻法的基本做法是:对给定的训练实例点和输入实例点,首先确定输入实例点的k个最近邻训练实例点,然后利用这k个训练实例点的类的多数来预测输入实例点的类。
  2. k近邻模型对应于基于训练数据集对特征空间的一个划分。k近邻法中,当训练集、距离度量、k值及分类决策规划确定后,其结果唯一确定。
  3. k近邻法三要素:距离度量、k值的选择、分类决策规则。常用的距离度量是欧氏距离及更一般的LpL_pLp​距离。k值小时,k近邻模型更复杂;k值大时,k近邻模型更简单。k值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的k。常用的分类决策规则是多数表决,对应于经验分线最小化。
  4. k近邻法的实现,需要考虑如何快速搜索k个最近邻点。kd树是一种便于对k维空间中的数据进行快速检索的数据结构。kd树是二叉树,表示对k维空间的一个划分,其每个结点对应于k维空间划分中的一个超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。

机器学习理论《统计学习方法》学习笔记:第三章 k近邻法相关推荐

  1. 【机器学习】《统计学习方法》学习笔记 第三章 k近邻法

    第三章 k k k 近邻法(KNN) 多分类模型,思路是将最近的 N N N 个邻居的分类值中的多数作为自己的分类值.没有显式的学习过程. 三个基本要素:距离度量. k k k 值选择和分类决策规则. ...

  2. 统计学习方法第三章 k近邻法

    文章目录 第三章 k近邻法 k近邻算法 k近邻模型的距离划分 k值的选择 k近邻分类决策规则 第三章 k近邻法 只讨论分类问题的k近邻法 k近邻三个基本要素: k值选择 距离度量 分类决策规则 k近邻 ...

  3. 《统计学习方法》学习笔记(4)--k近邻法及常用的距离(or 相似度)度量

    一.k近邻法基础知识 1. 特征空间中两个实例点的距离反应了两个实例点的相似程度. 2. k近邻模型三要素 = 距离度量(有不同的距离度量所确定的最邻近点不同)+k值的选择(应用中,k值一般取一个比较 ...

  4. 统计学习笔记(3)——k近邻法与kd树

    在使用k近邻法进行分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决的方式进行预测.由于k近邻模型的特征空间一般是n维实数向量,所以距离的计算通常采用的是欧式距离.关键的是k值的选取, ...

  5. 统计学习方法c++实现之二 k近邻法

    统计学习方法c++实现之二 k近邻算法 前言 k近邻算法可以说概念上很简单,即:"给定一个训练数据集,对新的输入实例,在训练数据集中找到与这个实例最邻近的k个实例,这k个实例的多数属于某个类 ...

  6. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  7. 机器人导论(第四版)学习笔记——第三章

    机器人导论(第四版)学习笔记--第三章 3 操作臂运动学 3.1 引言 3.2 连杆的描述 3.3 连杆连接的描述 3.4 连杆坐标系的定义 3.5 操作臂运动学 3.6 驱动空间.关节空间和笛卡尔空 ...

  8. 复现经典:《统计学习方法》第 3 章 k 近邻法

    本文是李航老师的<统计学习方法>[1]一书的代码复现. 作者:黄海广[2] 备注:代码都可以在github[3]中下载. 我将陆续将代码发布在公众号"机器学习初学者", ...

  9. 统计学习方法 学习笔记(1)统计学习方法及监督学习理论

    统计学习方法及监督学习理论 1.1.统计学习 1.1.1.统计学习的特点 1.1.2.统计学习的对象 1.1.3.统计学习的目的 1.1.4.统计学习的方法 1.1.5.统计学习的研究 1.1.6.统 ...

最新文章

  1. node中模块、AMD与CMD、ES6模块,node中使用ES6
  2. 前端一HTML:二十五盒子模型
  3. Machine Learning - Andrew Ng on Coursera (Week 4)
  4. JavaScript作用域闭包简述
  5. log4j添加日志一定记住在工程的web.xml文件下加一些内容
  6. 速学c++(2)-helloworld工程
  7. [原]RHCS集群的服务切换测试札记
  8. DSO windowed optimization 代码 (3)
  9. JAVA的方法的定义和调用
  10. 如何优雅的理解ECMAScript中的对象
  11. ubuntu php7.0 redis,ubuntu 搭建php7 redis
  12. HTML基础知识点(2)——常用标签
  13. Python中,os.listdir遍历纯数字文件乱序如何解决
  14. 开发Shell脚本解决DOS安全Linux服务器生产案例
  15. 【转】移动前端工作的那些事---前端制作篇之框架篇--jqMobi框架
  16. 神经网络与深度学习第3章:线性模型 阅读提问
  17. 七天学完Vue之第二天学习笔记(自定指令,过滤器,生命周期函数,动画效果)
  18. 智能医疗信息管理系统源码 医疗信息管理
  19. Macbook开启HIDPI(2K显示器)
  20. 电视无线dns服务器,电信电视dns遭到劫持,无线网络DNS被劫持了,怎么解决

热门文章

  1. 【问题】用ant编译时,提示编码utf为不可映射字符
  2. JSON 分析数据格式
  3. python tips(持续更新)
  4. 什么时候加上android.intent.category.DEFAULT和LAUNCHER
  5. 从基础末尾:CSS适用教程
  6. 2019小程序没必要做了_企业有必要开发微信小程序吗?
  7. 怎么设置qq信息同步服务器,QQ输入法如何设置网络同步
  8. java map string stu_Java Map遍历的三种方式 | 学步园
  9. python列表推导式格式_Python列表推导式(for表达式)及用法
  10. 使用DOM读取和维护XML数据