DBSCAN 聚类算法详解

参考:

  1. https://www.cnblogs.com/zhengxingpeng/p/6670486.html
  2. https://www.cnblogs.com/chaosimple/p/3164775.html
  3. https://www.jianshu.com/p/e8dd62bec026

1. DBSCAN简介:

  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。该算法利用基于密度聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。
  • DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是由于它直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,因此也具有两个比较明显的弱点:
    (1)当数据量增大时,要求较大的内存支持,I/O消耗也很大;
    (2)当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。

2. DBSCAN和传统聚类算法对比:

  • DBSCAN算法的目的在于过滤低密度区域,发现稠密度样本点。跟传统的基于层次的聚类和划分聚类的凸形聚类簇不同,该算法可以发现任意形状的聚类簇,与传统的算法相比它有如下优点:
    (1)与K-means比较起来,不需要输入要划分的聚类个数;
    (2)聚类簇的形状没有偏倚;
    (3)可以在需要时输入过滤噪声的参数;

3. 算法涉及的基本定义:

  • DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。
    DBSCAN 聚类算法详解_第1张图片
    可以发现:
    1.由于q必须是核心对象,因此直接密度可达不满足对称性,除非p也是核心对象。
    2.密度可达满足传递性。此时序列中的传递样本p1,p2,…,pn−1均为核心对象,因为只有核心对象才能使其他样本直接密度可达。密度可达不满足对称性
    3.密度相连关系是满足对称性的。密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。只有核心对象之间相互密度可达。然而,密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合
  • 从下图可以很容易理解上述定义。图中MinPts=5,红色的点都是核心对象,因为其ϵ邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ邻域内所有的样本相互都是密度相连的。
    DBSCAN 聚类算法详解_第2张图片

4. 基本思想:

  • DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。
  • 这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的ϵ邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵ邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的ϵ邻域里所有的样本的集合组成的一个DBSCAN聚类簇。
  • 那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。
  • 基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。
    (1)第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪声点。
    (2)第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。
    (3)第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法。

5. 基本要点:

  • 1.DBSCAN算法需要选择一种距离度量,对于待聚类的数据集中,任意两个点之间的距离,反映了点之间的密度,说明了点与点是否能够聚到同一类中。由于DBSCAN算法对高维数据定义密度很困难,所以对于二维空间中的点,可以使用欧几里德距离来进行度量。
  • 2.DBSCAN算法需要用户输入2个参数:一个参数是半径(Eps),表示以给定点P为中心的圆形邻域的范围;另一个参数是以点P为中心的邻域内最少点的数量(MinPts)。如果满足:以点P为中心、半径为Eps的邻域内的点的个数不少于MinPts,则称点P为核心点。
  • 3.DBSCAN聚类使用到一个k距离的概念,k距离是指:给定数据集P={p(i); i=0,1,…n},对于任意点P(i),计算点P(i)到集合D的子集S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)}中所有点之间的距离,距离按照从小到大的顺序排序,假设排序后的距离集合为D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)},则d(k)就被称为k距离。也就是说,k距离是点p(i)到所有点(除了p(i)点)之间距离第k近的距离。对待聚类集合中每个点p(i)都计算k距离,最后得到所有点的k距离集合E={e(1), e(2), …, e(n)}。
  • 4.根据经验计算半径Eps:根据得到的所有点的k距离集合E,对集合E进行升序排序后得到k距离集合E’,需要拟合一条排序后的E’集合中k距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的k距离的值,确定为半径Eps的值。
  • 5.根据经验计算最少点的数量MinPts:确定MinPts的大小,实际上也是确定k距离中k的值,DBSCAN算法取k=4,则MinPts=4。
  • 6.另外,如果觉得经验值聚类的结果不满意,可以适当调整Eps和MinPts的值,经过多次迭代计算对比,选择最合适的参数值。可以看出,如果MinPts不变,Eps取得值过大,会导致大多数点都聚到同一个簇中,Eps过小,会导致一个簇的分裂;如果Eps不变,MinPts的值取得过大,会导致同一个簇中点被标记为离群点,MinPts过小,会导致发现大量的核心点。

我们需要知道的是,DBSCAN算法,需要输入2个参数,这两个参数的计算都来自经验知识。半径Eps的计算依赖于计算k距离,DBSCAN取k=4,也就是设置MinPts=4,然后需要根据k距离曲线,根据经验观察找到合适的半径Eps的值。

6. 算法过程描述:

输入:样本集D=(x1,x2,…,xm),邻域参数(ϵ,MinPts), 样本距离度量方式;
输出: 簇划分C. 
DBSCAN 聚类算法详解_第3张图片

7. 小结:

  • 和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。
  • 那么我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。
  1. DBSCAN的主要优点有:
    1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
    2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
    3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
  2. DBSCAN的主要缺点有:
    1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
    2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
    3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

你可能感兴趣的:(聚类,算法)