首页 > 其他分享 >KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?

KD树——k=1时就是BST,里面的数学原理还是有不明白的地方,为啥方差划分?

时间:2023-07-04 18:31:49浏览次数:53  
标签:KD BST 方差 空间 划分 数学原理 维度 木条 数据

 Kd-Tree,即K-dimensional tree,是一棵二叉树,树中存储的是一些K维数据。在一个K维数据集合上构建一棵Kd-Tree代表了对该K维数据集合构成的K维空间的一个划分,即树中的每个结点就对应了一个K维的超矩形区域(Hyperrectangle)。

在介绍Kd-tree的相关算法前,我们先回顾一下二叉查找树(Binary Search Tree)的相关概念和算法。k=1就是BST!

例如,图1中是一棵二叉查找树,其满足BST的性质。

图1 二叉查找树(来源:Wiki)

 

KD树的构建

    kd树构建的伪代码如下图所示(伪代码来自《图像局部不变特性特征与描述》王永明 王贵锦 编著):

 

 

    再举一个简单直观的实例来介绍k-d树构建算法。假设有6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},数据点位于二维空间内,如下图所示。为了能有效的找到最近邻,k-d树采用分而治之的思想,即将整个空间划分为几个小部分,首先,粗黑线将空间一分为二,然后在两个子空间中,细黑直线又将整个空间划分为四部分,最后虚黑直线将这四部分进一步划分。

 

    6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}构建kd树的具体步骤为:

  1. 确定:split域=x。具体是:6个数据点在x,y维度上的数据方差分别为39,28.63,所以在x轴上方差更大,故split域值为x;
  2. 确定:Node-data = (7,2)。具体是:根据x维上的值将数据排序,6个数据的中值(所谓中值,即中间大小的值)为7,所以Node-data域位数据点(7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于:split=x轴的直线x=7;
  3. 确定:左子空间和右子空间。具体是:分割超平面x=7将整个空间分为两部分:x<=7的部分为左子空间,包含3个节点={(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点={(9,6),(8,1)};

    如上算法所述,kd树的构建是一个递归过程,我们对左子空间和右子空间内的数据重复根节点的过程就可以得到一级子节点(5,4)和(9,6),同时将空间和数据集进一步细分,如此往复直到空间中只包含一个数据点。


    与此同时,经过对上面所示的空间划分之后,我们可以看出,点(7,2)可以为根结点,从根结点出发的两条红粗斜线指向的(5,4)和(9,6)则为根结点的左右子结点,而(2,3),(4,7)则为(5,4)的左右孩子(通过两条细红斜线相连),最后,(8,1)为(9,6)的左孩子(通过细红斜线相连)。如此,便形成了下面这样一棵k-d树:

 

 

 

 

问题1: 每次对子空间的划分时,怎样确定在哪个维度上进行划分?

最简单的方法就是轮着来,即如果这次选择了在第i维上进行数据划分,那下一次就在第j(j≠i)维上进行划分,例如:j = (i mod k) + 1。想象一下我们切豆腐时,先是竖着切一刀,切成两半后,再横着来一刀,就得到了很小的方块豆腐。

可是“轮着来”的方法是否可以很好地解决问题呢?再次想象一下,我们现在要切的是一根木条,按照“轮着来”的方法先是竖着切一刀,木条一分为二,干净利落,接下来就是再横着切一刀,这个时候就有点考验刀法了,如果木条的直径(横截面)较大,还可以下手,如果直径较小,就没法往下切了。因此,如果K维数据的分布像上面的豆腐一样,“轮着来”的切分方法是可以奏效,但是如果K维度上数据的分布像木条一样,“轮着来”就不好用了。因此,还需要想想其他的切法。

如果一个K维数据集合的分布像木条一样,那就是说明这K维数据在木条较长方向代表的维度上,这些数据的分布散得比较开,数学上来说,就是这些数据在该维度上的方差(invariance)比较大,换句话说,正因为这些数据在该维度上分散的比较开,我们就更容易在这个维度上将它们划分开,因此,这就引出了我们选择维度的另一种方法:最大方差法(max invarince),即每次我们选择维度进行划分时,都选择具有最大方差维度。

 

标签:KD,BST,方差,空间,划分,数学原理,维度,木条,数据
From: https://blog.51cto.com/u_11908275/6624188

相关文章

  • markdown语法
    #一级标题##二级标题###三级标题---**粗体内容1**__粗体内容2__*斜体内容1*_斜体内容2_***斜粗体内容1***___斜粗体内容2___~~删除线~~分段>引用1>>引用2*列表项1*子项*子项*列表项2*列表项31.列表项11.列表项21.列表......
  • Markdown插入图片
    插入图片通过将本地或者网络上的图片往markdown文件传入图片时,都可能会存在因图片资源缺失或者防盗链等问题,图片显示不出来。而通过使用base64的编码将图片嵌入文档中,可解决阅读时图片可能显示不出的问题。转换工具https://kz16.top/png2base64.htmlbase64代码太长可采......
  • Markdown折叠内容
    折叠内容HTML <details> 标签指定了用户可以根据需要打开和关闭的额外细节。语法:<details><summary>Title</summary>contents...</details>标签介绍参考如下:details:折叠语法标签summary:折叠语法展示的摘要内容里面可以嵌套使用Markdown语法和HTML语法效果......
  • Typora实现Markdown标题自动编号
    1、背景Typora编写Markdown时,各级标题需要手动维护编号,如果标题顺序有调整,需要依次手工重新修改编号,特别是多级标题都要调整的话,更是异常麻烦!昨天在网上看到一个通过修改Typora风格主题的css文件实现自动编号的方法,试用之后感觉非常nice,再也不用管编号了,简直不要太爽!2、原文在此......
  • Markdown语法学习
    Markdown语法标题+空格为一级标题,#数量随级数递增最高六级字体Hello,World!粗体(两个*)Hello,World!斜体(一个*)Hello,World!斜体加粗(三个*)Hello,World!横线(两个~)引用(一个>+空格)分割线(三个-)(三个*)图片!+[图片名字]+(图片的路径/可以是本地地址/也可以是网络地址)超链......
  • # Day01 Markdown学习 ##
    Day01Markdown学习标题对应于Ctrl+1234,或者对应数量的#+""+标题名字体哈哈哈哈哈哈用对应数量的*Ctrl+u=下划线+b=粗体+i=斜体哈哈~~表示划线引用不乱于心,不困于情。不畏将来,不念过往。如此,安好。用>+""+话语 分割线用三个-或者三个*图片用英文的!......
  • 小工具 | cnblogs自动上传图片并生成markdown
    博客文章在本地都是用typora写的,文本可以直接复制上去,图片一个个上传太麻烦,这里推荐一个dotnet工具,给一个本地的typora文档,它会自动读取图片,上传到cnblogs,并替换掉原文档里的图片链接很方便,mark一下,工具地址为链接......
  • 人大金仓学习之二_ksh和kddm的学习
    人大金仓学习之二_ksh和kddm的学习摘要承接上一篇文章主要是这里总结一下ksh相关的文档.这里学习了很多文档:https://help.kingbase.com.cn/v8/perfor/performance-optimization/performance-optimization-6.html#sys-kddmhttps://help.kingbase.com.cn/v8/perfor/sql-op......
  • Markdown操作方式
    Markdown操作方式标题​ 一共分为六级书写方式:​ #(个数不同级数不同)+空格+编写内容引用​ 书写方式:>(个数不同效果不同)+空格字体​ 加粗:****在中间写文字​ 斜体:**在中间写文字​ 删除线:~~~~在中间写文字​ 高亮:====在中间写文字​ 上标:^^在中间写文字......
  • markdown终极指南
    markdown是我一直在用的一种语法,本文想把他的各个方面的特性系统的介绍一下,方便去做一些查阅和学习。介绍Markdown易于阅读,方便创作web文档,利于各平台无缝分发。Markdown语法灵感最大的来源还是纯文本email的格式,完全由标点符号标签组成的纯文本。Markdown文件应该......