相关文章

  1. K近邻算法和KD树详细介绍及其原理详解
  2. 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解
  3. 决策树算法和CART决策树算法详细介绍及其原理详解
  4. 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详解
  5. 硬间隔支持向量机算法、软间隔支持向量机算法、非线性支持向量机算法详细介绍及其原理详解
  6. 高斯分布、高斯混合模型、EM算法详细介绍及其原理详解

文章目录

  • 相关文章
  • 前言
  • 一、K近邻算法
  • 二、KD树
  • 总结

前言

K近邻算法一般是我们学习机器学习的入门算法,本篇文章详细介绍了K近邻算法,并对其原理进行了说明。同时,为了优化K近邻算法查找最近K个邻域样本的性能,本文也对KD进行详细介绍和原理说明。相信通过文本的学习,您对K近邻算法和KD树一定有更深的理解,本文的全部内容如下所示!


一、K近邻算法

假设现在有这么一种情况,如下图所示,平面上有两类点,其中有三个A类点,两个B类点,我们如何确定新的点(?点)属于A类点还是B类点呢?

图1:简单的分类问题

一个非常自然的想法就是,如果它(?点)更靠近A类点,那么就属于A类点,反之,如果它更靠近B类点,那么就属于B类点。所以,我们可以选择距离它最近的三个点作为参考点,如下图所示:

图2:确定邻域范围

可以看到,在离它最近的三个点中,其中一个属于A类点,两个属于B类点,如果此时我们采用少数服从多数的原则,就可以判断它属于B类点,这种分类算法就是K近邻( K-Nearest Neighbor,KNN )算法,在本例中,因为选取了三个点作为参考点,所以K=3,这也是K近邻算法名称的由来。K近邻算法通常由三个要素:

  • 距离远近:距离度量
  • 参考点数量:K值
  • 分类决策规则:少数服从多数

现在我们考虑更一般的情况,假设现在有数据集T={(x1,y1),(x2,y2),…,(xn,yn)}T=\{(x_{1},y_{1}),(x_{2},y_{2}),\dots ,(x_{n},y_{n})\}T={(x1​,y1​),(x2​,y2​),…,(xn​,yn​)},其中每一个元素是一个样本,数据集TTT中共NNN个样本,其中:

  • x1∼xnx_{1} \sim x_{n}x1​∼xn​是样本特征
  • y1∼yny_{1} \sim y_{n}y1​∼yn​样本类别

假设现在数据集TTT中共有555(n=5n=5n=5)个样本点,我们的目的就是将待分类样本(x,y)(x,y)(x,y)进行正确的样本分类

图3:更一般的分类问题

根据上面介绍过的K近邻算法,我们可以首先找到待分类样本(x,y)(x,y)(x,y)的邻域:

图4:待分类样本(x,y)的邻域

找到其邻域后,我们就可以对待分类样本(x,y)(x,y)(x,y)进行分类,这个过程共分为两步:

  1. 根据距离度量和K值计算xxx的邻域Nk(x)N_{k}(x)Nk​(x)
  2. 根据分类决策规则计算类别yyy

这里首先要解决的问题就是如何计算xxx的邻域Nk(x)N_{k}(x)Nk​(x),一个非常自然的想法就是计算xxx和每个样本之间的距离,如下图所示:

图5:待分类样本x和每个样本之间的距离

然后将计算后得到的距离保存在一个数组里面:

图6:使用数组保存待分类样本x和每个样本之间的距离

因为我们要找距离最近的K个样本作为邻域样本,所以对数组进行升序排序,排序后的前K个数据,就代表了距离xxx最近的K个样本,那么这K个样本就是xxx的邻域样本:

图7:找出与待分类样本x距离最近的K个样本

上面提到的这种方法虽然很简单,但是需要计算xxx和每个样本之间的距离,所以整个线性查找计算过程的时间复杂度为O(N)O(N)O(N),所以计算量较大,那么是否存在更加快速的求邻域的方法呢?答案是有的,也就是我们耳熟能详的KD树(K-Dimensional Tree)。

二、KD树

以下图中的七个初始样本为例,这七个样本作为初始样本使用,如果有需要进行分类的样本,那么就要计算待分类样本与这七个初始样本之间的距离。

图8:二维空间中的七个初始样本

刚才我们也提到了,如果全部都遍历求距离的话,计算量较大,所以我们使用KD树来计算最小距离,在使用KD树之前,我们首先要对初始样本进行KD树的初始化,整个过程如下所示:

  1. 首先要将这七个初始样本储存在KD树中,由上图可以看到,样本坐标为(x,y)(x,y)(x,y),所以首先我们考虑xxx轴,也就是首先以xxx轴为标准,找到这七个初始样本中xxx坐标的中位数,也就是节点四,此时,我们将节点四储存为KD树的根节点,以节点四的xxx坐标为界,可以把平面分成左右两个部分,如下图所示:

图9:根据x轴样本的中位数划分左右子空间
  1. 当我们将平面分为左右两部分之后,首先考虑左边三个初始样本,在这三个初始样本中,我们以yyy轴作为标准寻找这三个初始样本的yyy坐标的中位数,也就是节点一。我们把节点一储存在节点四的左子树中,并把左边的空间分割成两个子空间,如下图所示:

图10:根据根节点的左子树y轴样本的中位数划分上下子空间

需要注意的是,分割后的两个子空间中分别只有一个样本,那么我们分别将这两个样本储存为叶节点,如下图所示:

图11:将分割后的两个子空间中的唯一样本作为叶节点储存
  1. 以此类推,我们可以构建出右边的KD子树,首先以yyy轴为标准,找到中位数节点六,然后将两个子空间中的节点保存在叶节点中,如下图所示:

图12:根据根节点的右子树y轴样本的中位数划分上下子空间
  1. 当然,如果还有额外的样本,我们可以继续以xxx为标准,将空间进一步划分,如下图所示,总之,就是交替以xxx和yyy作为标准进行子空间的划分和KD树的建立

图13:交替以x和y作为标准进行子空间的划分和KD树的建立

此时,我们已经将七个初始样本进行了KD树的初始化,假如现在有一个待分类样本xxx,其坐标为[438,681][438,681][438,681]。如下图所示:

图14:待分类样本x在二维空间中的位置

此时我们该如何利用已经初始化好的KD树寻找和xxx最近的样本呢?整个过程如下所示:

  1. 首先从根节点遍历,因为节点四的空间划分是以xxx轴为标准的,而待分类样本xxx的xxx值小于节点四的xxx值,所以我们应该查找左边的子树,如下图所示:

图15:根据KD树向左子树进行邻域查找
  1. 类似的,因为左子树的根节点是节点一,并且节点一的划分依据是yyy轴,而且待分类样本xxx的yyy值小于节点一的yyy值,因此我们应该查找左边的叶节点,如下图所示:

图16:根据KD树继续向左子树进行邻域查找
  1. 当我们达到叶节点后就不能继续划分了,因为已经到头了,所以我们暂时将叶节点二作为距离待分类样本xxx最近的初始样本,然后我们以待分类样本xxx到节点二的距离作为半径,得到xxx的查找范围,那么距离待分类样本xxx最近的样本就在这个范围里面,如下图所示:

图17:确定了距离待分类样本x最近的样本范围
  1. 现在我们已经确定了距离待分类样本xxx最近的初始样本所处的范围(上图中圆圈内的部分),所以我们只需要计算在这个范围内的所有初始样本与待分类样本xxx的距离,然后通过不停的更新最小距离样本就可以得到距离待分类样本xxx最近的初始样本了,这个过程我们可以通过回溯算法遍历KD树得到,在回溯的过程中需要记住一个查找原则:如果此节点所代表的空间范围和查找范围相交,则计算与待分类样本xxx的距离,否则不计算,整个回溯遍历KD树的过程如下所示:

    ① 首先回溯到节点二的父节点,也就是节点一,因为节点一所代表的空间范围和查找范围相交,所以我们计算节点一到待分类样本xxx之间的距离,并更新最小距离样本(因为节点一与待分类样本xxx之间的距离更小)。然后继续回溯到节点三,按照同样的方法计算并更新最小距离,如下图所示:

图18:使用回溯算法计算节点一与节点三距离待分类样本x的距离是否比刚才计算的最小邻域距离更小

② 以此类推,我们可以回溯到根节点,计算每一个和查找范围相交的节点(橙色的节点)与待分类样本xxx之间的距离,最后发现和待分类样本xxx最近的节点就是节点三,这个过程如下图所示:

图19:继续使用回溯算法计算其他所有节点距离待分类样本x的距离是否比之前计算的最小邻域距离更小,直至确定最小邻域距离
  1. 当我们找到距离待分类样本xxx最近的初始样本(节点三)后,可以根据K值继续求得其他最近的初始样本,直到求出K个停止,然后根据分类决策规则就可以得到待分类样本的类别了

可以看到,通过KD树查找距离最近的样本时,并不需要对每个样本都计算距离,在上例中节点五并没有参与计算,因为节点五所代表的空间范围和查找范围不相交,所以就可以节省很多不必要的计算。在当nnn足够大,且样本随机分布的情况下,KD树检索距离最近样本的平均时间复杂度为O(logN)O(logN)O(logN),很明显比最开始提到的线性查找计算性能更高。

如果我们使用KD树作为计算距离最近的初始样本的检索方法,此时假设初始样本为T={(x1,y1),(x2,y2),…,(xn,yn)}T=\{(x_{1},y_{1}),(x_{2},y_{2}),\dots ,(x_{n},y_{n})\}T={(x1​,y1​),(x2​,y2​),…,(xn​,yn​)},待分类样本为(x,y)(x,y)(x,y),那么原来的K近邻算法可以被改进为如下步骤:

  1. 根据TTT中的样本构建KD树
  2. 根据距离度量,运行K次KD树搜索,计算Nk(x)N_{k}(x)Nk​(x)
  3. 根据分类决策规则,计算新样本的类别yyy

总结

以上就是本文的全部内容了,后续还会为大家带来更优质的关于机器学习的算法博客,下篇博文见!

K近邻算法和KD树详细介绍及其原理详解相关推荐

  1. 决策树算法和CART决策树算法详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  2. 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解

    相关文章 K近邻算法和KD树详细介绍及其原理详解 朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解 决策树算法和CART决策树算法详细介绍及其原理详解 线性回归算法和逻辑斯谛回归算法详细介绍及其原理详 ...

  3. 激活函数、Sigmoid激活函数、tanh激活函数、ReLU激活函数、Leaky ReLU激活函数、Parametric ReLU激活函数详细介绍及其原理详解

    相关文章 梯度下降算法.随机梯度下降算法.动量随机梯度下降算法.AdaGrad算法.RMSProp算法.Adam算法详细介绍及其原理详解 反向传播算法和计算图详细介绍及其原理详解 激活函数.Sigmo ...

  4. 卷积神经网络(CNN)详细介绍及其原理详解

    文章目录 前言 一.什么是卷积神经网络 二.输入层 三.卷积层 四.池化层 五.全连接层 六.输出层 七.回顾整个过程 总结 前言 本文总结了关于卷积神经网络(CNN)的一些基础的概念,并且对于其中的 ...

  5. K近邻算法的kd树实现

    k近邻算法的介绍 k近邻算法是一种基本的分类和回归方法,这里只实现分类的k近邻算法. k近邻算法的输入为实例的特征向量,对应特征空间的点:输出为实例的类别,可以取多类. k近邻算法不具有显式的学习过程 ...

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

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

  7. 《统计学习方法》—— k近邻方法、kd树以及python3实现

    前言 k近邻方法的初衷很简单,就是找最近的k个数据,根据这些数据的标记,按照某种规则,给新的数据标记.这里,我们可以看到三个重点:k值,距离度量和决策规则. k值决定方法的复杂程度.考虑k很大,足以包 ...

  8. K近邻快速算法 -- KD树、BBF改进算法

    K近邻算法即是查找与当前点(向量)距离最近的K个点(向量),距离计算一般用欧氏距离. 最简单的方法就是穷举法:计算每个向量与当前向量的欧氏距离,选取最小的K个为所求.但这种方法计算量太大,无法应对大样 ...

  9. K近邻法之kd树及其Python实现

    作为机器学习中一种基本的分类方法,K近邻(KNN)法是一种相对简单的方法.其中一个理由是K近邻法不需要对训练集进行学习.然而,不需要对训练集进行学习,反过来也会造成对测试集进行判定时,计算与空间复杂度 ...

最新文章

  1. 前端页面如何引入公用的页面header和footer
  2. 如何利用.NETCore向Azure EventHubs准实时批量发送数据?
  3. dataframe 空值替换为0_Python数据分析:Pandas之DataFrame
  4. layui内置loading等待加载
  5. java的jstl的标签库_java_jstl 标签库
  6. 3 SAP STMS跨服务器传请求号
  7. javascript textContent与innerText的异同分析
  8. OPPO Reno3系列旗舰官宣:骁龙765G+正反双曲面设计
  9. hibernate教程笔记4
  10. linux下安装python3及特别注意事项
  11. NI软件卸载以及清除残余文件
  12. catia 快捷键 激活零件_CATIA教程:CATIA快捷键及学习技巧总结
  13. css插件载进去ps里面,CSS3Ps(ps图层插件)官方版
  14. proteus仿真arduino控制舵机
  15. CentOS7.3下Zabbix3.5之微信报警配置
  16. MySQL 5.6.22绿色版安装
  17. 马氏距离进行离群值检测
  18. uClinux编译方法
  19. 2021年压力容器作业R2移动式压力容器充装证考试题库
  20. 程序设计与算法二郭炜枚举002拨钟问题及解题思路

热门文章

  1. 云服务器win系统下架设手游白日门传奇详细教程
  2. 吴恩达深度学习第二周--logistic回归作业1
  3. Windows实现M2Det遇到的错误
  4. [转载]C#开源项目(国外的还是很多)
  5. oracle中的CURRVAL和NEXTVAL用法(sequence是序列号生成器)
  6. 浅谈JCFXBL“技术管理”思路
  7. PHP模板引擎Smarty(一)Smarty下载、配置、一个最简单的应用示例
  8. sony的故事 第 32 章
  9. Android (包含1.6到12)AOSP源码下载(百度网盘)
  10. 如何将IIS6服务器的网站批量迁移到IIS7中