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

news2024/10/3 0:27:22

相关文章

  1. K近邻算法和KD树详细介绍及其原理详解

文章目录

  • 相关文章
  • 前言
  • 一、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 = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) } T=\{(x_{1},y_{1}),(x_{2},y_{2}),\dots ,(x_{n},y_{n})\} T={(x1,y1),(x2,y2),,(xn,yn)},其中每一个元素是一个样本,数据集 T T T中共 N N N个样本,其中:

  • x 1 ∼ x n x_{1} \sim x_{n} x1xn是样本特征
  • y 1 ∼ y n y_{1} \sim y_{n} y1yn样本类别

  假设现在数据集 T T T中共有 5 5 5 n = 5 n=5 n=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值计算 x x x的邻域 N k ( x ) N_{k}(x) Nk(x)
  2. 根据分类决策规则计算类别 y y y

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

请添加图片描述

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

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

请添加图片描述

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

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

请添加图片描述

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

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

二、KD树

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

请添加图片描述

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

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

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

请添加图片描述

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

请添加图片描述

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

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

请添加图片描述

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

请添加图片描述

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

请添加图片描述

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

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

请添加图片描述

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

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

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

请添加图片描述

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

请添加图片描述

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

请添加图片描述

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

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

请添加图片描述

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

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

请添加图片描述

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

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

  如果我们使用KD树作为计算距离最近的初始样本的检索方法,此时假设初始样本为 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x n , y n ) } 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. 根据 T T T中的样本构建KD树
  2. 根据距离度量,运行K次KD树搜索,计算 N k ( x ) N_{k}(x) Nk(x)
  3. 根据分类决策规则,计算新样本的类别 y y y

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring工厂模式

解决方案1:工厂模式 可以使用抽象工厂模式,让StudentDao、StudentService的实现在在工厂中生成,而工厂可以根据配置 文件的指定类型来创建不同的对象,而且工厂本身一般是不变的。从而降低了对可以变的业务逻辑类的 依赖,接近的软…

字节青训前端笔记 | 数据可视化基础

本课程主要内容可以分为三个章节: 数据可视化的基本概念可视化设计的基本原则面向前端的可视化工具 本手册可以作为学生学习数据可视化的“学习指南”,按照手册所列内容,结合扩展资料进行系统的学习和实践。本课程没有讨论更为前沿的可视化…

推荐5款干净又实用的软件

我们在使用电脑的时候,总是会用到一些好用的软件,今天分享这5款干净又实用的软件,实在是太好用了,我不允许你不知道。 1.桌面工具——火柴 火柴是一款集快速搜索,程序启动、本地文件查找、网站直达、网络搜索等多种功…

OSACN-Net:使用深度学习和Gabor心电图信号谱图进行睡眠呼吸暂停分类

这篇文章在之前读过一次,其主要的思路就是利用Gabor变换,将心电信号转变为光谱图进行识别研究,总体来讲,不同于其他的利用心电信号分类的算法,该论文将心电信号转换为光谱图,在此基础上,分类问题…

java面试题(二十)中间件redis

1.1 Redis可以用来做什么? 参考答案 Redis最常用来做缓存,是实现分布式缓存的首先中间件;Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求;Redis可以作为计算工具,能用很小的…

基于微信小程序 java高校后勤报修系统 Springboot校园报修管理系统

1绪论 5 1.1项目研究的背景 5 1.2开发意义 5 1.3项目研究内容 5 2开发技术介绍 6 2.1 B/S架构 6 2.2Java技术 6 2.3MySQL 介绍 7 2.4MySQL环境配置 7 2.5SpringBoot技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 9 3.2网站性能需求…

跟开发打了半个月后,我终于get报bug的正确姿势了

在测试人员提需求的时候,大家经常会看到,测试员和开发一言不合就上BUG。然后开发一下就炸了,屡试不爽,招招致命。 曾经看到有个段子这么写道: 不要对程序员说,你的代码有BUG。他的第一反应是:…

C语言学习笔记-强制类型转换

强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型…

《Redis实战篇》六、秒杀优化

6、秒杀优化 6.0 压力测试 目的:测试1000个用户抢购优惠券时秒杀功能的并发性能~ ①数据库中创建1000用户 这里推荐使用开源工具:https://www.sqlfather.com/ ,导入以下配置即可一键生成模拟数据 {"dbName":"hmdp",…

Java中的Set集合

Set不能存储重复元素,元素无序(指的是不按照添加的顺序,List集合是按照添加顺序存储的)hashSet注:源码底层是hashMap实现的,因为hashMap是双列的,其中键是不能重复的,而hashSet是单列…

使用f-string格式化构建字符串

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 字符串的格式化输出(f-string) print(f字符串{变量}字符串) [太阳]选择题 对于以下python代码最后输出的结果是? name "小明" print("【显示】f输出…

全新视角!带你一文读懂ChatGPT!

最了解你的人不是你的朋友,而是你的敌人。 ——《东邪西毒》 目录 什么是ChatGPT? ChatGPT为什么会突然爆红网络? ChatGPT能帮助我们做什么? 获取源码?私信?关注?点赞?收藏&…

记录--千万别让 console.log 上生产!用 Performance 和 Memory 告诉你为什么

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 很多前端都喜欢用 console.log 调试,先不谈调试效率怎么样,首先 console.log 有个致命的问题:会导致内存泄漏。 为什么这么说呢? 用 Performance 和 Mem…

【信管11.4】合同及合同管理过程(二)

合同及合同管理过程(二)合同管理过程不属于项目管理过程中的知识域,所以它也不是 PMP 中的内容。其实截止到这里,整个 PMP 中的相关知识你已经学完了。如果抛开我们第一大章信息化和信息管理相关的内容,你就可以直接去…

Spring Boot(五十九):Sa-Token-Quick-Login插件快速登录认证

1 Sa-Token-Quick-Login解决的问题 Sa-Token-Quick-Login 可以为一个系统快速的、零代码 注入一个登录页面 试想一下,假如我们开发了一个非常简单的小系统,比如说:服务器性能监控页面, 我们将它部署在服务器上,通过访…

Docker不做虚拟化内核,对.NET有什么影响?

引子前两天刷抖音,看见了这样一个问题。问题:容器化不做虚拟内核,会有什么弊端?Java很多方法会跟CPU的核数有关,这个时候调用系统函数,读到的是宿主机信息,而不是我们限制资源的大小。思考&…

FoveaBox原理与代码解析

paper:FoveaBox: Beyond Anchor-based Object Detectorcode:https://github.com/taokong/FoveaBox背景基于anchor的检测模型需要仔细设计anchor,常用方法之一是根据特定数据集的统计结果确定anchor的number、scale、ratio等,但这种…

elasticsearch8.3.2搭建部署

Elasticsearch8.3.2搭建部署详细步骤 0.过往文章 ES-6文章: Elasticsearch6.6.0部署、原理和使用介绍: https://blog.csdn.net/wt334502157/article/details/119515730 ES-7文章: Elasticsearch7.6.1部署、原理和使用介绍: https://blog.csdn.net/wt…

堆排序

章节目录:一、相关概述1.1 基本介绍1.2 排序思想二、基本应用2.1 步骤说明2.2 代码示例三、结束语一、相关概述 1.1 基本介绍 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序。它的最坏最好平均时间复杂度均为 O(nlogn)&#x…

(深度学习快速入门)第五章第二节:GAN变体

文章目录一:CycleGAN(1)概述(2)双判别器(3)损失函数二:StyleGAN(1)解耦表征学习(2)概述三:DCGAN一:CycleGAN …