KdTree------一种递归的邻近搜索策略

KdTree简介

在BSTree中,节点分割的是一维数轴,那么在二维中,节点分割为平面了,就像这样:

在这里插入图片描述
黄色的点作为根节点,上面的点归左子树,下面的点归右子树,接下来再不断地划分,最后得到一棵树就是的BSPTree(binary space partitioning tree). 分割的那条线叫做分割超平面(splitting hyperplane),在一维中是一个点,二维中是线,三维的是面。

KDTree就是超平面都垂直于轴的BSPTree。同样的数据集,用KDTree划分之后就是这样:
在这里插入图片描述
KdTree 是以二叉搜索树(Binary Search Tree)为原型的用于空间检索的数据结构,能够在随机分布的空间内以 O(log2N) 的时间复杂度实现对平面内点的搜索以及 O(log2N) + R 的复杂度查询平面内任意矩形内的所有点(R为矩形内点的个数)。 KdTree的应用十分广泛,包括且不限于范围搜索,最邻近点搜索,物理引擎中的碰撞检测以及地理节点(如外卖商家)数据库等。

原理简介
KdTree的实现方法与BST十分相似,以最常用的二维平面的KdTree为例,其每个节点存储一个二维的坐标点,并将平面空间以该点所在的横线/竖线递归地分割成两个子空间。
以width = 1.0, height = 1.0的单位平面为例,依次插入下列点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述注意
点对平面的分割方式是横向/纵向按照层次交替出现(根节点是哪个方向都可以)。插入节点的方法类似于BST,即从根节点开始,(设要插入的节点为Pinsert,当前遍历的节点为Pcurrent)如果Pinsert在Pcurrent的左边或者下边,那么就访问Pcurrent的left child, 反之访问right child直到成为叶子节点。
本KdTree不支持删除操作。

复杂度比较
KdTree在最坏情况下的复杂度与暴力求解(用集合遍历所有元素)一样都是O(n), 但在随机分布的情况下可以达到O(log2N)。
以下为两个数据结构在随机分布的空间中的算法复杂度 (其中R表示矩形范围内点的个数)
在这里插入图片描述

KdTree密度聚类算法

参考博客:
博客1
博客2

第一种方法叫做密度减法聚类
功能:能识别特定尺寸的点云簇集合,通过参数设置期望形状的大小。
输入:一片点云
输出:是几个聚类完成的点簇和聚类中心点
类别不需要提前设定,最终聚成几类由初始参数决定。
论文 3D Candidate Selection Method for Pedestrian Detection on Non-Planar Roads 用其来提取行人的ROI。

第二种方法叫做自适应密度聚类
功能:可以寻找出每个点云的三维连通域,不需要设置形状和大小参数。
输入:一片点云
输出:每个点云所在的连通域以及此点云集合一共有多少连通域。
类别不需要提前设定,最终聚成几类由连通规则中参数决定。
论文 一种聚类与滤波融合的点云去噪平滑方法 和 密度聚类算法在连续分布点云去噪中的应用 用这种聚类方法来对点云去噪。

第一种方法 密度减法聚类

密度减法聚类

1 此方法对密度定义为
在这里插入图片描述
公式9中rax,ray和raz就是那个你想要设置的聚类形状参数。可以看出
<1> 对于一个特定的三维点,离其越近的点对它的密度加成越大。
<2>从求和符号可以看出,它是遍历所有三维点。

2 再看公式(10),这个公式是这个算法的核心。
在这里插入图片描述
公式来源
因为聚类的目的是想得到几个密度比较大的点簇,是为了避免多个聚类中心集中在一起。举个例子,你面前有几个人而且你有他们的点云,你想通过聚类把这几个人分出来,他们体型相差很大比如,这些人中有人身宽体胖的人,有人身材比较瘦小,你的本意是想把这几个人都识别出来。回到算法中,看流程图,如果我们每此检测下一次聚类中心的时候去掉了更新所有点云这一步骤,那么那个胖的人身上一定会被聚类成好多个聚类中心。

公式10起到这样一个作用:凡是离上次刚得到的聚类中心近的点,它们的密度都会被削减,削减影响的范围由rbx,rby,rbz控制。rb参数的选取一般要大于ra参数,论文中取rbm=1.5ram m=x,y,z;

3 最终聚类点簇的大小差异控制
这部分参数也是本方法的一个重要的参数,因为它们控制着最终聚类结果中每个点簇的大小,以及最大点簇和最小点簇的密度差异有多大。
具体参数有:Thmax,Thmin,ra,cnt和公式9中的半径参数。
其中,公式中的半径参数控制着聚类物体的大概三维尺寸(椭球)
Thmax:当一个候选聚类中心的密度大于第一个聚类中心密度的Thmax倍,直接就接纳此聚类中心。
Thmin:当一个候选聚类中心的密度小于第一个聚类中心密度的Thmin倍,直接把对应三维点拉黑,以后再也不用,并认为它不会是聚类中心。
ra:此参数控制相邻聚类中心的距离,选取的越大,生成的聚类中心间隔越大。
最后,流程图还剩一个参数dmin,这个参数的含义是:本候选聚类中心到其他聚类中心距离中的最小值。

第二种:自适应密度聚类
这种方法就是实际上就是三维连通域检测。聚类最后的输出是若干块三维连通域。和上一种方法不一样,这种聚类方法不需要设置新装参数,输出的每块连通域的大小不一定相等。下面给出这种 方法的流程图:

在这里插入图片描述
此算法寻找连通域的步骤对应于流程图的第二至第三个判断条件组成的循环体。每循环一次,生成一个新的三维连通域。

密度定义 :此方法没有对密度定义,而是定义了一个类似密度的核心对象:是在点云空间范围内,如果离点p的欧式距离小于e的其他点云数大于一个值Minpts,就认为点p是核心对象。

那么为什么称这种方法叫自适应密度聚类呢?
答案是,聚类它可以根据点云自适应求出半径参数e和点数Minpts,不需要自己提前设定,当然自己也可以提前设定。
怎么求参数e和Minpts呢?

在上述密度聚类步骤中,初始半径e 和最小邻域数MinPts均为自定义参数。参数初始值设置好后,需要根据聚类效果不断调整这两个参数以获得最好的聚类效果,比较耗时。为了解决这一问题,本文提出一种自适应参数计算方法。
在这里插入图片描述
首先,根据式(1) 计算任意两点之间的欧式距离1。
然后根据式( 2)-式( 3) 求得dist(i,j ) 的最大值maxdist 和最小值mindist:
maxdist = Max{dist( i,j)| 0 ≤ i < n,0 ≤ j < n} -------------( 2)
mindist = Min{dist( i,j )| 0 ≤ i < n,0 ≤ j < n} ------------- ( 3)
进而根据式( 4) 求得距离间隔distrange。
distrange = maxdist -mindist -----------------------------------( 4)

其中,n 表示点的数目。将距离间隔等距分为十段,统计dist(i,j)在每段范围内的频数,初始半径e 的值即为erang 所在分段的中值。erang 的计算公式如式( 5)所示。
erang = Max{pk | 0 ≤ k < 10}---- ---------------------------------(5)

初始半径e 确定后,根据e 逐步增大最小邻域数目MinPts,计算邻域超过最小邻域数目的点的数目pNum(计算公式如式( 7)所示) 。随着最小邻域数目的增加,pNum 会逐渐减少并趋于稳定,选择拐点所在的最小邻域数目作为MinPts。其中,对于任意给定点p 的邻域点数目pNumi的计算如式( 6)所示。
pNumi = count{dist( i,j)< e | 0 ≤ j < n} ----------------------( 6)
pNum = count{ pNumi ≥ MinPts |0 ≤ i < n}------------------- ( 7)
通过该方法可以实现初始半径和最小邻域数的自动选择,进而避免这两个参数的反复设置。

测试说明:
输入:用深度相机获得的半稠密点云,如图3
在这里插入图片描述
输出:聚类结果图,如图4,图5,去噪图,如图6。

在这里插入图片描述
可以看出,这种去噪方法还不错,缺点是计算量较大,实时性难以满足。i7-6700的笔记本上一秒3帧左右。

KdTree密度的聚类算法及优化

参考博客

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

DBSCAN中的几个定义:

  • Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;
  • 核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象;
  • 直接密度可达:对于样本集合D,如果样本点q在p的Ε领域内,并且p为核心对象,那么对象q从对象p直接密度可达。
  • 密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p=p1,q=pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
  • 密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。

可以发现,密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合。

Eg: 假设半径Ε=3,MinPts=3,点p的E领域中有点{m,p,p1,p2,o}, 点m的E领域中有点{m,q,p,m1,m2},点q的E领域中有点{q,m},点o的E领域中有点{o,p,s},点s的E领域中有点{o,s,s1}.
  那么核心对象有p,m,o,s(q不是核心对象,因为它对应的E领域中点数量等于2,小于MinPts=3);
  点m从点p直接密度可达,因为m在p的E领域内,并且p为核心对象;
  点q从点p密度可达,因为点q从点m直接密度可达,并且点m从点p直接密度可达;
  点q到点s密度相连,因为点q从点p密度可达,并且s从点p密度可达。

二、算法优点:

  1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。
  2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。
  3. 同时,DBSCAN能够识别出噪声点。对离群点有较好的鲁棒性,甚至可以检测离群点。
  4. DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。
  5. DBSCAN被设计与数据库一同使用,可以加速区域的查询。例如 使用R*树

三、算法缺点:
1、 DBScan不能很好反映高维数据。
2、DBScan不能很好反映数据集以变化的密度。
3、由于DBSCAN算法直接对整个数据集进行操作,并且在聚类之前需要建立相应的R*树,并绘制k-dist图,因此算法所需的内存空间和I/O消耗都相当可观。在计算资源有限而数据量又非常庞大的情况下,DBSCAN算法的效率将受到很大影响。(DBSCAN算法将区域查询得到的所有未被处理过的点都作为种子点,留待下一步扩展处理。对于大规模数据集中的较大类而言,这种策略会使种子点的数目不断膨胀,算法所需的内存空间也会快速增加。
4、由于DBSCAN算法使用了全局性表征密度的参数,因此当各个类的密度不均匀,或类间的距离相差很大时,聚类的质量较差。。(当各个类的密度不均匀、或类间的距离相差很大时,如果根据密度较高的类选取较小的Eps值,那么密度相对较低的类中的对象Eps 邻域中的点数将小Minpts,则这些点将会被错当成边界点,从而不被用于所在类的进一步扩展,因此导致密度较低的类被划分成多个性质相似的类。与此相反,如果根据密度较低的类来选取较大的Eps值,则会导致离得较近而密度较大的类被合并,而它们之间的差异被忽略。所以在上述情况下,很难选取一个合适的全局Eps值来获得比较准确的聚类结果。)
5、DBSCAN不是完全确定的,边界点从不同的簇中获得,可以使不同簇的一部分,取决于数据处理。
6、DBSCAN的质量取决于regionQuery(P,Eps)函数中距离的测量。最常用的距离度量是欧式距离,尤其是在高维数据中,由于所谓的维数灾难,这种度量基本上是无用的,很难为E找到一个恰当的值。虽然目前有一些基于欧式距离的算法,但是如果不能对数据和规模有很好的了解,也很难找一个有意义的距离阈值E。
7、DBSCAN的质量取决于regionQuery(P,Eps)函数中距离的测量。最常用的距离度量是欧式距离,尤其是在高维数据中,由于所谓的维数灾难,这种度量基本上是无用的,很难为E找到一个恰当的值。虽然目前有一些基于欧式距离的算法,但是如果不能对数据和规模有很好的了解,也很难找一个有意义的距离阈值E。
8、输入参数敏感,确定参数Eps , MinPts困难 ,若选取不当 ,将造成聚类质量下降。
9、由于经典的DBSCAN算法中参数Eps和MinPts在聚类过程中是不变的,使得该算法难以适应密度不均匀的数据集.

四、算法改进:

  1. 对缺点3的改进:通过选用核心点邻域中的部分点作为种子点来扩展类,从而大大减少区域查询的次数,降低I/O开销,实现快速聚类。
  2. 缺点4的改进:为了解决上述问题,周水庚等人提出了PDBSCAN ( Partitioning-based DBSCAN)算法。该算法基于数据分区技术来扩展DBSCAN算法,它根据数据的分布特性,将整个数据空间划分为多个较小的分区,然后分别对这些局部分区进行聚类,最后将各个局部的聚类结果进行合并。 PDBSCAN 的算法思想是:首先,根据数据集在某一维或多个维上的分布特性,将整个数据空间划分为若干个局部区域,使得各局部区域内的数据尽可能分布均匀;然后依次绘制各个局部区域的k-dist图,并依次得到各个区域的Eps值,接着用 DBSCAN 算法对各个局部区域进行局部聚类;最后,将各个局部聚类的结果进行合并,从而完成整个数据集的聚类分析。由于每个局部区域都使用各自的局部Eps值来进行聚类,因此有效缓解了因使用全局Eps值而导致的聚类质量恶化的问题。
    3.缺点8改进:
      DBSCAN 算法的改进,输入参数的处理:针对 DBSCAN算法对输入参数(聚类半径Eps , 聚类点数 MinPts) 敏感问题 ,作如下处理。由于参数的设置通常是依赖经验 , 当数据密度相差较大和类间距离分布不均匀时 ,很难选取一个合适的 Eps 值来进行聚类且得到比较准确的结果 . 因此 , 事先确定算法的参数值大小是不可取的 ,应在聚类过程中根据聚类结果的好坏对参数进行适当的调整。比如选择适当的评价函数作为评价聚类结果的尺度。反复调整算法的参数 ,重新聚类 ,直到聚类结果满足要求。尽管DBSCAN算法提供了利用绘制降序k-距离图的可视化方法来选择Eps ,选定的Eps值已经比较接近“理想”值 ; 但常有微小差距 , 最终造成聚类结果的相差很大。可以考虑采用如下方法来加以改善 :
      (1)可以对所有聚类对象按照从一个簇到另一个簇 ,按簇边缘→簇核心→簇边缘的顺序排序。这样,该对象序列就可以反映出数据空间基于密度的簇结构信息。基于这些信息可以容易地确定合适的Eps值 ,并随之发现各个簇。
      (2)不对原始数据集进行聚类 ,而是通过从数据集合中抽取高密度点生成新的数据集合,并修改密度参数 ,反复进行这一过程 , 直到生成的数据集合可以很容易地被聚类为止,然后以此结果为基础,再将其它点逐层地吸附到各个类中。这样,就避免了DBSCAN算法中输入参数对聚类结果的影响。
      (3)采用核聚类的思想对样本集进行非线性变换,使样本集的分布尽可能地均匀,经过核函数的映射使原来没有显现的特征突现出来,然后再用全局参量Eps ,从而能够更好地聚类 , 得到较好的结果 .
      (4)在绝大多数聚类结果不理想的情况下,是Eps值选择过小,导致本应为一个簇的对象集合被分析成了多个子簇。被分开的子簇共享一些对象 ,可以认为子簇通过这些共享的对象相互连接。而DBSCAN算法将子簇的连接信息简单地丢掉 。因此,可以通过记录下所有的簇连接信息,由用户根据实际的聚类结果和簇连接信息,将被错误分开的子簇合并。这样可以提高聚类的效果,而输入参数Eps的变化对聚类结果的影响,就被最后的合并过程屏蔽掉。可以考虑以下两种方式进行改进 :
        1)并行化.
       从DBSCAN算法可以看出,全局变量Eps值影响了聚类质量,尤其是数据分布不均匀时.因此,考虑对数据进行划分,每一个划分中的数据分布相对较均匀 ,根据每个划分中数据的分布密集程度来选取Eps值.这样一方面降低了全局变量Eps值的影响,另一方面由于具有多个划分 ,因此考虑并行处理 ,从而提高聚类效率 ,也降低了DBSCAN算法对内存的较高要求
       2)增量式处理。
      当数据增加或者删除时 ,只考虑其增加或删除的数据所影响到的那些类 . 这种方法在处理大数据集时非常有效 ,不需要重新对数据库中的数据进行聚类 ,只需要对类进行渐进性地更新 , 修正和加强已发现的类 . 另外 ,由于高维数据的复杂性 , 使聚类分析的效率和实用性都很差。通过确定聚类空间中和聚类主题相关性较强的数据维,来降低聚类空间的维度。利用数据降维可以降低数据结构上的复杂性。目前,有多种降维技术均可用于特征空间的削减。在方法的选择上应根据降维后,信息丢失率在可接收范围内 ,来选择一种合适的降维方法。
    4.对缺点9改进:
    4.1 自适应选择 Eps 参数
        对于不均匀数据分布,各个数据与周围数据的相似程度不同,因此,针对每个点,将距离该点最近的多个点的距离平均值作为该点处的稠密程度的评判标准,即对任意一点P,根据距离矩阵,选取与P点最近的k个点,计算距离的平均值.此时,每个点都能够得出一个k最近点平均距离.
        然后对所有点的一维k最近点平均距离数据进行DBSCAN聚类。再对聚类结果中每类 i找到其最大平均距离的点.最后将该点与它的第k点的距离作为该类的邻域阈值Epsi ,并将其保存以备聚类.这种发现Eps的方法主要考虑到对于不同密度的数据集,应根据各个数据的稠密程度,分别选取合适的阈值进行聚类.由于聚类中所采用的参数Eps只能够确定聚类结果中同一类数据中的密度差别,所以,参数选取所引起的误差不会对聚类结果产生很大影响.
      
    4.2 基于变参数的 DBSCAN 聚类
    1)将4.1中得出的邻域阈值Epsi按照由小到大的顺序排列,准备聚类;
    2)选取最小的邻域阈值,MinPts可以不变,对数据进行DBSCAN聚类;
    3)然后使用下一个邻域阈值和MinPts作为参数,对标注为噪声的数据再次进行 DBSCAN聚类;
    4)不断循环,直到所有邻域阈值均使用完毕,聚类结束.
    在多次聚类过程中,邻域阈值要由小到大进行聚类.使用较小阈值进行聚类时,距离较大的类中的数据由于不满足该阈值而不被处理到,所以较小的距离阈值只能处理密度较大的点,不会对小密度数据产生影响。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值