【算法积累】一种改进的DBSCAN算法

一种改进的DBSCAN算法

1 前言

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

2 传统的DBSCAN算法

如下表所示,给出了一些关于DBSCAN算法的相关定义
【算法积累】一种改进的DBSCAN算法_第1张图片其中,密度可达可用以下公式表示
【算法积累】一种改进的DBSCAN算法_第2张图片

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

3 改进的DBSCAN算法

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

3.1 相关定义

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

定义1 :网格单元

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

【算法积累】一种改进的DBSCAN算法_第3张图片

定义2: k k k邻接网格集

c e l l cell cell是一个网格单元格。一个矩形区域可以通过在 c e l l cell cell的上下左右四个方向上加 k k k个边长(即 k ∗ ε k*\varepsilon kε的长度)来扩展, k k k邻接网格集定义为该矩形区域所包含的网格集,用 N c e l l Ncell Ncell表示,如下图绿色区域所示,表示了定义1中 c e l l cell cell的1邻接网格集。
【算法积累】一种改进的DBSCAN算法_第4张图片
定义3: E p s Eps Eps矩形区域
c e l l cell cell是一个网格单元格。在 c e l l cell cell的4个顶点处画4个圆心,半径为 E p s Eps Eps c e l l cell cell E p s Eps Eps矩形区域定义为该区域由能够覆盖上述4个圆区域的 k k k邻接网格集组成。

3.2 改进DBSCAN算法的主要思想

c e l l cell cell的边长 L p g Lpg Lpg设为 E p s / p Eps/p Eps/p,便于根据上述定义计算 c e l l cell cell E p s Eps Eps矩形区域。显然, c e l l cell cell E p s Eps Eps矩形区域是由 c e l l cell cell p p p邻接网格集组成的区域。当 p ⩾ 1 p\geqslant 1 p1时,矩形区域的边长为 ( 2 p + 1 ) ∗ L p g (2p+1)*Lpg (2p+1)Lpg;当 p < 1 p<1 p<1时, c e l l cell cell E p s Eps Eps矩形区域是由 c e l l cell cell的1邻接网格集组成的区域,边长为 3 ∗ L p g 3*Lpg 3Lpg

c e l l cell cell p = 1 p=1 p=1 E p s Eps Eps矩形区域如下图中蓝色区域所示。从图中可以看出,当 c e l l cell cell E p s Eps Eps矩形区域内的点数小于 M i n P t s MinPts MinPts时, c e l l cell cell中的任意一点都不可能是核心点。只需计算 c e l l cell cell中的种子点与 c e l l cell cell矩形区域内的点之间的距离,即可判断种子点是否为核心点。大大减少了点对点距离的计算。

【算法积累】一种改进的DBSCAN算法_第5张图片
基于网格单元的DBSCAN算法包括以下步骤:

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

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

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

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

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

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

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

核心点的判断方法在上面有详细的介绍,利用欧几里德距离公式计算两个 t t t维空间点之间的距离,公式如下:
【算法积累】一种改进的DBSCAN算法_第6张图片

4 时间复杂度分析

4.1 DBSCAN

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

4.2 改进的DBSCAN

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

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

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

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

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

[参考文献]
[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.

你可能感兴趣的:(数学建模,比赛,聚类,算法)