机器学习笔记:KD树

1 引入原因

  • K近邻算法需要在整个数据集中搜索和测试数据x最近的k个点,如果一一计算,然后再排序,开销过大
    • 引入KD树的作用就是对KNN搜索和排序的耗时进行改进

2 KD树

2.1 主体思路

  • 以空间换时间,利用训练样本集中的样本点,沿各维度依次对k维空间进行划分,建立二叉树
  • 利用分治思想提高算法搜索效率
  • 二分查找的算法复杂度是O(logN)O(logN),KD树的搜索效率与之接近(取决于所构造kd-tree是否接近平衡树)

 

  •  上图为为训练样本对空间的划分以及对应的kd树
  • 绿色实心五角星为测试样本,通过kd-tree的搜索算法,快速找到与其最近邻的3个训练样本点(空心五角星标注的点)

2.2 KD树的建立

2.2.1 以一个例子引入

  • 比如我有6个点:(2,3),(4,7),(5,4),(7,2),(8,1),(9,6)
  • 1) 数据有两个维度,分别计算x,y方向上数据的方差
    • x方向上的方差最大
    • ——>先沿着X轴方向进行split
    • 注:这一步也可以不要,因为KD树适用的问题大多是维度小于20的,所以按照维度顺序一个一个来也没有问题
  • 2)根据x轴方向的值2,5,9,4,8,7排序选出中位数为7
    • x≤7的和x >7的被分开了
  • 3) 被分开的左半区和右半区分别选出y轴方向的中位数(偶数选小的那个)
    •  
  • 4)左上方三个点再根据x轴分一刀(其他三个区域已经各只剩一个点了)
    •  
  • 最终得到的KD树

     

2.2.2 伪代码

def kd_tree_construct:input: x: 训练样本集dim: 当前节点的分割维度(子节点的分割维度=(dim+1)%样本的维度)output: node: 构造好的kd tree的根节点if 只有一个数据点:创建一个叶子结点node包含这一单一的点node.point = x[0]node.son1 = Nonenode.son2 = Nonereturn nodeelse:记dim维度上的中位点为x(对x中的数据按dim维排序,取中位点,偶数个则取较小的那个)记xl为左集合(dim维小于p点的所有点)记xr为右集合(dim维大于p点的所有点)创建带有两个孩子的node:node.point = pnode.son1  = fit_kd_tree(xl)node.son2  = fit_kd_tree(xr)return node

2.3 KD树上的最近邻查找

2.3.1 伪代码

def kd_tree_search:global:Q, 缓存k个最近邻点(初始时包含一个无穷远点)q, 与Q对应,保存Q中各点与测试点的距离input: k, 寻找k个最近邻t, 测试点node, 当前节点(一开始时根节点)dim, 当前节点的分割维度(子节点的分割维度=(dim+1)%数据点的维度)output: 无if distance(t, node.point) < max(q):将node.point添加到Q,并同步更新q若Q内超过k个近邻点,则移出与测试点距离最远的那个点,并同步更新qif t[dim]-max(q) < node.point[dim]:kd_tree_search(k,t,node.son1)if t[dim]+max(q) > node.point[dim]:kd_tree_search(k,t,node.son2)

 

2.3.1 以一个例子开始

2.3.1.1 例子1 

搜索(2.1,3.1)

记k=1

  • 第1步:将(7,2)加入Q中,maxq=5.02,更新Q
    • 2.1-5.02≤7
      • 搜索左儿子
      • 第2步:将(5.4)加入Q中,maxq=3.04,更新Q
        • 3.1-3.04≤4
          • 搜索下儿子
          • 第3步:将(2,3)加入Q中,maxq=0.1414,更新Q
            • 已经是叶子节点了,结束
        • 3.1-3.04≥4
          • 搜索上儿子
          • 第4步:将(4,7)加入Q中,maxq=4.338>0.1414,不更新Q,仍为0.1414
            • 已经是叶子节点了,结束
    • 2.1-5.02≥7
      • 搜索右儿子
      • 第5步,将(9,6)加入Q中,maxq=7.484>0.1414,不更新Q,仍为0.1414
      • 3.1+7.484>6
        • 搜索上儿子
        • 没有上儿子,结束
  • 算法结束,最近的点是(2,3),q=0.1414

2.3.1.2 例子2 回溯时改变最近邻点

假设我们要查询的点是2,4.5

同样记k=1

  • 第1步:将(7,2)加入Q中,maxq=5.59,更新Q
    • 2-5.59≤7
      • 搜索左儿子
      • 第2步:将(5.4)加入Q中,maxq=3.04,更新Q
        • 4.5-3.04≤4
          • 搜索下儿子
          • 第3步:将(2,3)加入Q中,maxq=1.5,更新Q
        • 4.5+3.04≥4
          • 搜索上儿子
          • 第4步:将(4,7)加入Q中,maxq=3.20>1.5,不更新Q,仍为1.5
    • 2+5.59 >7
      • 搜索右儿子
      • 第5步,将(9,6)加入Q中,maxq=7.16>1.5,不更新Q,仍为1.5
        • 4.5+7.16>6
          • 搜索上儿子
          • 没有上儿子,结束
  • 算法结束,最近的点是(2,3),距离为1.5

 

参考内容:KNN的核心算法kd-tree和ball-tree - 简书 (jianshu.com)

k-d tree算法 - J_Outsider - 博客园 (cnblogs.com)

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

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

相关文章

HTTPS协议加密原理

目录 一、什么是HTTPS 二、什么是加密/解密 三、为什么要加密 四、常见的加密方式 1.对称加密 2. 非对称加密 五、HTTPS加密方式探讨 1.只使用对称加密 2.只使用非对称加密 3.非对称加密对称加密 4.非对称加密对称加密CA认证 六、总结 一、什么是HTTPS HTTP 协议&a…

Pytorch06-复杂模型构建

https://github.com/ExpressGit/Pytorch_Study_Demo 1、PyTorch 复杂模型构建 1、模型截图2、模型部件实现3、模型组装 2、模型定义 2.1、Sequential 1、当模型的前向计算为简单串联各个层的计算时&#xff0c; Sequential 类可以通过更加简单的方式定义模型。2、可以接收…

HTML5岗位技能实训室建设方案

一 、系统概述 HTML5岗位技能技术是计算机类专业重要的核心课程&#xff0c;课程所包含的教学内容多&#xff0c;实践性强&#xff0c;并且相关技术更新快。传统的课堂讲授模式以教师为中心&#xff0c;学生被动式接收&#xff0c;难以调动学生学习的积极性和主动性。混合式教学…

Linux--进程地址空间

1.线程地址空间 所谓进程地址空间&#xff08;process address space&#xff09;&#xff0c;就是从进程的视角看到的地址空间&#xff0c;是进程运行时所用到的虚拟地址的集合。 简单地说&#xff0c;进程就是内核数据结构和代码和本身的代码和数据&#xff0c;进程本身不能…

【Linux】socket 编程基础

文章目录 &#x1f4d5; 网络间的通信&#x1f4d5; socket 是什么1. socket 套接字2. 套接字描述符3. 基本的 socket 接口函数3.1 头文件3.2 socket() 函数3.3 bind() 函数struct sockaddr主机序列与网络序列 3.4 listen() 函数3.5 connect() 函数3.6 accept() 函数IP 地址风格…

3.BGP状态机和路由注入方式

BGP状态机 BGP路由的生成 不同于IGP路由协议,BGP自身并不会发现并计算产生路由,BGP将GP路由表中的路由注入到BGP路由表中,并通过Update报文传递给BGP对等体。 BGP注入路由的方式有两种: Networkimport-route与IGP协议相同,BGP支持根据已有的路由条目进行聚合,生成聚合路由…

Java 时间日期处理,工作必用(建议收藏)

工作中经常会遇到对时间日期进行处理的业务&#xff0c;像日期类的API个人觉得不需要背&#xff0c;需要的时候去查资料就行。我整理了Java8之前及之后日期类常用的时间日期处理方法&#xff0c;方便工作需要时查找&#xff0c;觉得有用的朋友可以收藏。 一、日期格式化和解析 …

linux挂载内网镜像源文件,支持yum安装

cd /etc/yum.repos.d/vim kylin_aarch64.repo 重建yum缓存 yum clean allyum makecacheyum repolist

RH1288V3 - 初识物理服务器

如果你拥有一台物理服务器(不是云服务器) 个人比较推荐你用物理服务器&#xff0c;虽然性能会比云要来的差&#xff0c;但是不用每月交钱上。云服务固然方便&#xff0c;但是几个核的性能和一点存储&#xff0c;想做一个动漫网站固然要很多mp4这种影视资源&#xff0c;云服务器…

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基&#xff0c;这三个相辅相成又各有区别。 &#xff08;1&#xff09;数学以线性代数为主要研究工具和部分微积分技术为手…

最新绕过目标域名CDN进行信息收集技术

绕过目标域名CDN进行信息收集 1&#xff0e;CDN简介及工作流程 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的目的是通过在现有的网络架构中增加一层新的Cache&#xff08;缓存&#xff09;层&#xff0c;将网站的内容发布到最接近用户的网…

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天&#xff0c;我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行&#xff0c;甚至崩溃。但是&#xff0c;请不要担心&#xff0c;我会为大家提供5种解决方法&#xff0c;帮助大家轻松解决问题。 首先&#xff0c;我们来看…

单片机学习-蜂鸣器电子元件

蜂鸣器是有什么作用的&#xff1f; 蜂鸣器 是 一种 一体化结构 的电子训响器&#xff0c;可以发出声音的电子元器件 蜂鸣器分类&#xff1f; ①压电式蜂鸣器&#xff08;图左&#xff09; 称&#xff1a; 无源蜂鸣器 ②电磁式蜂鸣器&#xff08;图右&#xff09; 称&#xf…

陪诊系统源码开发:实现个性化医疗陪护的创新之路

陪诊系统的源码开发在现代医疗中具有重要意义。本文将通过代码示例介绍陪诊系统的源码开发&#xff0c;展示如何实现个性化医疗陪护的创新方案。 1. 安装和环境设置&#xff1a; 首先&#xff0c;确保你的开发环境中已经安装了合适的编程语言和框架&#xff0c;比如Python和…

人力资源小程序的设计原则与实现方法

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业推广和服务的新利器。对于人力资源行业来说&#xff0c;开发一款定制化的小程序不仅可以提升服务效率&#xff0c;还可以增强品牌形象和用户粘性。那么&#xff0c;如何定制开发人力资源类的小程序呢&#xff1f;下面…

使用Miniconda

Conda是一个开源的包和环境管理器&#xff0c;使用它可以在同一台机器上安装不同版本的Python软件包和依赖了。Anaconda和Miniconda都集成了Conda,Anaconda包括更多的工具包&#xff0c;Miniconda则只包括Conda和Python。 在很奇葩的Deepin下Miniconda安装之旅 中&#xff0c;…

8路光栅尺磁栅尺编码器或16路高速DI脉冲信号转Modbus TCP网络模块 YL99-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数&#xff0c;频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数&#xff0c;可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

探讨uniapp的组件使用的问题

1 view Flex是Flexible Box的缩写&#xff0c;意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 当设置display: flex后&#xff0c;继续给view等容器组件设置flex-direction:row或column&#xff0c;就可以在该容器内按行或列排布子组件。uni-app推荐使用flex布…

LeetCode——有效的括号

这里&#xff0c;我提供一种用栈来解决的方法&#xff1a; 思路&#xff1a;栈的结构是先进后出&#xff0c;这样我们就可以模拟栈结构了&#xff0c;如果是‘&#xff08;’、‘{’、‘[’任何一种&#xff0c;直接push进栈就可以了&#xff0c;如果是‘}’、‘&#xff09;’…

Windows部署SQL Server-开发者版

一、简介 SQL Server 开发者版本&#xff0c;是一个为开发人员准备的版本。它是免费的&#xff0c;但不能在生产中使用它。它包含所有 SQL Server 企业版的功能&#xff0c;但不能在生产中部署&#xff0c;是一个用于非生产环境的免费版本。 二、下载 访问 https://www.mic…