一、kd树概念

  kd树(K-Dimensional Tree)是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
  kd树是二叉树,表示对K维空间的一个划分(partition);构造Kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域;Kd树的每个结点对应于一个k维超矩形区域。

  KD树算法包括三步:第一步是建树,第二部是搜索最近邻,最后一步是预测。

  注:kd树中的k指的是k维空间,knn中的k指的是距离目标点最近的k个实例样本点。

二、构建kd树

  我们首先来看建树的方法。KD树建树采用的是从m个样本的k维特征中,分别计算k个特征的取值的方差,用方差最大的第i维特征 k i k_i ki​来作为根节点。对于这个特征,我们选择特征 k i k_i ki​的取值的中位数 k v k_v kv​对应的样本作为划分点,对于所有第n维特征的取值小于 k v k_v kv​的样本,我们划入左子树;对于第n维特征的取值大于等于 k v k_v kv​的样本,我们划入右子树。对于左子树和右子树,我们采用和刚才同样的办法来找方差最大的特征来做跟节点,递归的生成KD树。

我们用6个二维的样本{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}来构建kd树,具体步骤如下:
  1)、寻找划分样本集的特征,即选取最大方差的维度特征。6个数据点在x,y维度上的数据方差分别为6.97,5.37,所以在x轴上方差更大,确定用第1维特征建树。
  2)、寻找划分点,即确定划分样本集的特征上的分割点。根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以划分点的数据是(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:划分点维度的直线x=7;
  3)、确定左子空间和右子空间,即构建左、右子树。 分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)}。
  4)、循环1)2)3)步骤,直至左右子树无法分割而得到最终的kd树。用同样的办法划分左子树的节点{(2,3),(5,4),(4,7)}和右子树的节点{(9,6),(8,1)},最终得到KD树。

  最终的kd树和构建kd树寻找的节点,如下所示:

三、KD树搜索最近邻

1、搜索原理

  当我们生成KD树以后,就可以去预测测试集里面的样本目标点了。对于一个目标点,我们首先在KD树里面找到包含目标点的叶子节点。以目标点为圆心,以目标点到叶子节点样本实例的距离为半径,得到一个超球体,最近邻的点一定在这个超球体内部。然后返回叶子节点的父节点,检查另一个子节点包含的超矩形体是否和超球体相交,如果相交就到这个子节点寻找是否有更加近的近邻,有的话就更新最近邻。如果不相交那就简单了,我们直接返回父节点的父节点,在另一个子树继续搜索最近邻。当回溯到根节点时,算法结束,此时保存的最近邻节点就是最终的最近邻。

  从上面的描述可以看出,KD树划分后可以大大减少无效的最近邻搜索,很多样本点由于所在的超矩形体和超球体不相交,根本不需要计算距离。大大节省了计算时间。

2、搜索实例

  我们用刚建立的KD树,来看对点(2,4.5)找最近邻的过程。

  先进行二叉查找,先从(7,2)查找到(5,4)节点,在进行查找时是由y = 4为分割超平面的,由于查找点为y值为4.5,因此进入右子空间查找到(4,7),形成搜索路径<(7,2),(5,4),(4,7)>,但 (4,7)与目标查找点的距离为3.202,而(5,4)与查找点之间的距离为3.041,所以(5,4)为查询点的最近点; 以(2,4.5)为圆心,以3.041为半径作圆,如下图所示。可见该圆和y = 4超平面交割,所以需要进入(5,4)左子空间进行查找,也就是将(2,3)节点加入搜索路径中得<(7,2),(2,3)>;于是接着搜索至(2,3)叶子节点,(2,3)距离(2,4.5)比(5,4)要近,所以最近邻点更新为(2,3),最近距离更新为1.5;回溯查找至(5,4),直到最后回溯到根结点(7,2)的时候,以(2,4.5)为圆心1.5为半径作圆,并不和x = 7分割超平面交割,如下图所示。至此,搜索路径回溯完,返回最近邻点(2,3),最近距离1.5。

  对应的图如下:

三、KD树预测

  有了KD树搜索最近邻的办法,KD树的预测就很简单了,在KD树搜索最近邻的基础上,我们选择到了第一个最近邻样本,就把它置为已选。在第二轮中,我们忽略置为已选的样本,重新选择最近邻,这样跑k次,就得到了目标的K个最近邻,然后根据多数表决法,如果是KNN分类,预测为K个最近邻里面有最多类别数的类别。如果是KNN回归,用K个最近邻样本输出的平均值作为回归预测值。

k近邻算法——kd树相关推荐

  1. k近邻法的实现(kd树)-相关问题梳理

    K邻近算法的伪代码 机器学习实战 李锐等译 对未知类别属性的数据集的每一个点依次进行如下操作: 1.计算已知类别数据集中的点与当前点之间的距离: 2.按照距离递增次序排序 3.选取与当前点距离最小的k ...

  2. 机器学习 K近邻之KD树基本概念、绘制KD树

    K近邻算法回顾 K近邻法模型的三要素: 距离度量:  K值的选取:K值的选取一般可以采用交叉验证法,且一般小于训练集样本量的平方根 分类决策规则:多数表决等价于误分类数最小 关于K近邻的问题: 1.简 ...

  3. 机器学习 K近邻之KD树 搜索KD树

    思想:K近邻搜索 1.寻找"当前最近点" 寻找最近邻的子节点作为目标的"当前最近点" 2.回溯 以目标点和"当前最近点"的距离沿树根部进行回 ...

  4. java实现k 近邻算法_K近邻算法哪家强?KDTree、Annoy、HNSW原理和使用方法介绍

    1.什么是K近邻算法 K近邻算法(KNN)是一种常用的分类和回归方法,它的基本思想是从训练集中寻找和输入样本最相似的k个样本,如果这k个样本中的大多数属于某一个类别,则输入的样本也属于这个类别. 关于 ...

  5. 基于KD树的K近邻算法(KNN)算法

    文章目录 KNN 简介 KNN 三要素 距离度量 k值的选择 分类决策规则 KNN 实现 1,构造kd树 2,搜索最近邻 3,预测 用kd树完成最近邻搜索 K近邻算法(KNN)算法,是一种基本的分类与 ...

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

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

  7. 基于kd树的k近邻算法——KNN

    1.简介 k近邻算法是机器学习中一种基本的分类与回归算法,对你没听错k近邻算法不仅可以用来做分类,还可以用于回归,英文全称为k-Nearest Neighbor简称k-NN.k近邻算法属于一种有监督学 ...

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

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

  9. 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    原文出自:http://blog.csdn.net/v_JULY_v/article/details/8203674 前言 前两日,在微博上说:"到今天为止,我至少亏欠了3篇文章待写:1.K ...

最新文章

  1. 用switch编写一个计算机程序,超级新手,用switch写了个计算器程序,求指导
  2. Facebook构建高性能Android视频组件实践之路
  3. IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
  4. Java 10:将流收集到不可修改的集合中
  5. 【转】如何让ucgui支持24位色(24bpp)
  6. R实例:根据经纬度坐标批量返回行政区域信息
  7. php 动态引用dll文件路径,win平台环境变量与dll动态链接库搜索路径小结
  8. 在线直播网站源码开发,音视频同步的处理方案及选择
  9. 学好平面设计需要哪些技术功底?
  10. PlaySound 播放内存中的音频数据
  11. 多源信息融合中的一些名词及知识点
  12. C++Builder:定时器Timer控件
  13. nginx反向代理中proxy_set_header的含义
  14. 遥控汽车网页小游戏html源码
  15. 在Unity中创建基于Node节点的编辑器 (二) 窗口序列化
  16. 快来西瓜创客吃瓜啦!
  17. HTML中基本元素基本设置(例如:字体颜色、大小、背景颜色)。
  18. 台式电脑耳机有杂音并且音量小解决
  19. 机器人皮肤:气球和废纸都能有生命!万物皆有成为生命的可能!
  20. DevOps到底是什么意思?-小白收藏

热门文章

  1. 大众点评列表页采集思路,破解字体文件反爬(包含项目github 可用时间至2020-01-21)
  2. mysql 常用sql调优_MySQL 常用SQL优化
  3. 【C#】关闭 Window 之后,无法设置 Visibility,也无法调用 Show、ShowDialogor 或 WindowInteropHelper.EnsureHandle
  4. java 去掉前后逗号_java 怎样去掉最后面那个逗号
  5. 无痕模式运行html,各个浏览器开启无痕模式的方法教程
  6. ubuntu下通过鼠标右键创建txt文件
  7. R语言ggplot2可视化:ggplot2可视化为轴标签添加复杂下标(Subscripts)和上标(superscripts)、离子化学符号(ionic chemical notation)等
  8. 静态扫描之Yara第一话--安装及使用Yara
  9. javaweb开发和j2ee区别
  10. 用javascript函数设置延时执行jQuery