一种改进的DBSCAN算法

1 前言

改进了传统的DBSCAN算法,算法的时间复杂度从O(n2)O(n^2)O(n2)降低到了O(n+m∗k2)O(n+m*k^2)O(n+mk2)

2 传统的DBSCAN算法

如下表所示,给出了一些关于DBSCAN算法的相关定义
在这里插入图片描述其中,密度可达可用以下公式表示
在这里插入图片描述

根据以上定义,DBSCAN的集群发现过程首先需要从数据集DDD中找到一个点ppp并对其进行检查。如果点ppp是一个核心点,即点pppEpsEpsEps邻域内的点个数大于等于MinPtsMinPtsMinPts,那么在接下来的过程中,点pppEpsEpsEps邻域内的点将依次被检查为种子点,即连续查询种子点。如果当前种子点也是核心点,则将其EpsEpsEps邻域内的点放入种子集。这样,当前类中的数据点就会被不断地扩展,直到找到一个完整的类。如果ppp是一个边界点,这意味着点pppEpsEpsEps邻域内的点数小于MinPtsMinPtsMinPts,因此算法会选择数据集DDD中的下一个点进行检查。其余未被划分成任何簇的点将被标记为噪声点。

3 改进的DBSCAN算法

改进的DBSCAN算法采用广度优先搜索连接多个网格单元,采用贪婪算法的增长模式形成聚类。

3.1 相关定义

以下为改进DBSCAN算法的一些定义:

定义1 :网格单元

设置一个划分参数ε\varepsilonε,将每一个维度的数据空间划分为相同长度的区域,从而将整个二维数据空间划分若干个边长为ε\varepsilonε的网格单元。如果最后一个网格单元的边长小于ε\varepsilonε,但为了确保计算的准确性和一致性,我们仍设置最后一个网格单元的边长为ε\varepsilonε。下图中橙色的部分代表了一个网格单元。

在这里插入图片描述

定义2:kkk邻接网格集

cellcellcell是一个网格单元格。一个矩形区域可以通过在cellcellcell的上下左右四个方向上加kkk个边长(即k∗εk*\varepsilonkε的长度)来扩展,kkk邻接网格集定义为该矩形区域所包含的网格集,用NcellNcellNcell表示,如下图绿色区域所示,表示了定义1中cellcellcell的1邻接网格集。
在这里插入图片描述
定义3:EpsEpsEps矩形区域
cellcellcell是一个网格单元格。在cellcellcell的4个顶点处画4个圆心,半径为EpsEpsEpscellcellcellEpsEpsEps矩形区域定义为该区域由能够覆盖上述4个圆区域的kkk邻接网格集组成。

3.2 改进DBSCAN算法的主要思想

cellcellcell的边长LpgLpgLpg设为Eps/pEps/pEps/p,便于根据上述定义计算cellcellcellEpsEpsEps矩形区域。显然,cellcellcellEpsEpsEps矩形区域是由cellcellcellppp邻接网格集组成的区域。当p⩾1p\geqslant 1p1时,矩形区域的边长为(2p+1)∗Lpg(2p+1)*Lpg(2p+1)Lpg;当p<1p<1p<1时,cellcellcellEpsEpsEps矩形区域是由cellcellcell的1邻接网格集组成的区域,边长为3∗Lpg3*Lpg3Lpg

cellcellcellp=1p=1p=1EpsEpsEps矩形区域如下图中蓝色区域所示。从图中可以看出,当cellcellcellEpsEpsEps矩形区域内的点数小于MinPtsMinPtsMinPts时,cellcellcell中的任意一点都不可能是核心点。只需计算cellcellcell中的种子点与cellcellcell矩形区域内的点之间的距离,即可判断种子点是否为核心点。大大减少了点对点距离的计算。

在这里插入图片描述
基于网格单元的DBSCAN算法包括以下步骤:

1.将数据空间划分为几个网格单元

2.建立数据点到网格单元的映射关系

3.使用广度优先搜索生成集群。这一步表明搜索点ppp的邻域范围正在缩小。具体程序如下:

​ a)将第一个(下一个)标记为未读的点放入队列中作为种子点,直到所有点都标记为已读再结束;

​ b)取队列头上的点来执行区域查询,并将该点标记为已读,如果队列为空,则执行步骤a);

​ c)如果在EpsEpsEps矩形区域内点的数量大于或等于MinPtsMinPtsMinPts,然后测试EpsEpsEps矩形区域内的点到种子点的距离小于等于EpsEpsEps的点个数是否大于等于MinPtsMinPtsMinPts,如果测试结果是真的,种子点是一个核心点,并将其EpsEpsEps邻近的点作为种子点放入队列中;如果测试结果是假的,将其恢复为未读。如果EpsEpsEps矩形区域内的点数小于MinPtsMinPtsMinPts,立即将种子点恢复为未读;

​ d)重复执行步骤b),c)。

核心点的判断方法在上面有详细的介绍,利用欧几里德距离公式计算两个ttt维空间点之间的距离,公式如下:
在这里插入图片描述

4 时间复杂度分析

4.1 DBSCAN

因为每次查询都返回该区域内的所有对象,时间复杂度为O(n2)O(n^2)O(n2),因此DBSCAN算法的时间开销很大。此外,所有的数据都应该保存在内存中,它需要大的内存和大的I/O消耗。

4.2 改进的DBSCAN

本文提出的方法针对二维数据,算法包括3个步骤:

第1步,将数据空间划分为网格单元,需要计算每个维度数据空间的最大值和最小值,时间复杂度为O(n)O(n)O(n)

第2步,算法在建立数据点到网格单元的映射关系时,需要遍历nnn个数据集,因此时间复杂度为O(n)O(n)O(n)

第3步,利用广度优先搜索生成集群,将种子点的检查线程化为广度优先搜索过程,时间复杂度为O(n+me)O(n+me)O(n+me)mmm为扩展点个数,eee为计算格单元边长Lpg=Eps/pLpg=Eps/pLpg=Eps/p时,在(2k+1)2(2k+1)^2(2k+1)2个网格内计算点数sss并进行相应操作的时间,所以eee的时间复杂度是O(k2)O(k^2)O(k2),如果p>1p>1p>1k=pk=pk=p;如果p<1p<1p<1k=1k=1k=1。最终整个算法的时间复杂度为O(n+mk2)O(n+mk^2)O(n+mk2),显然,当mmmkkk的值变小时,时间复杂度会降低。

当数据空间出现一个或多个聚类,并且p<1p<1p<1k=1k=1k=1的情况,尽管kkk足够小,EpsEpsEps矩形区域的点数也会随着网格单元的增大而显著增加,很明显,这里的时间复杂度大于p=1p=1p=1时的复杂度。当p⩾1p\geqslant 1p1时,k=pk=pk=pEpsEpsEps矩形区域减小,但随着kkk的增大,k2k^2k2明显增大。对于哪一种情况的产生的更显著取决于聚类的属性。

[参考文献]
[1] Meng’Ao L, Dongxue M, Songyuan G, et al. Research and improvement of DBSCAN cluster algorithm[C]. 2015 7th International Conference on Information Technology in Medicine and Education (ITME). IEEE, 2015: 537-540.

更多推荐