聚类算法--DBSCAN

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类算法--DBSCAN相关的知识,希望对你有一定的参考价值。

参考技术A        DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。 基于密度的带有噪声的空间聚类,可用于异常值监测,通俗来说就是基于密度的聚类算法 !

        聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。聚类算法是无监督的算法。

DBSCAN算法的目的: 是基于密度寻找被低密度区域分离的高密度样本分为三类: 

稠密区域内部的点(核心点): 在半径Eps内含有超过MinPts数目的点 

稠密区域边缘上的点(边缘点): 在半径Eps内点的数量小于MinPts(即不是核心点),但是其邻域内至少包含一个核心点 

稀疏区域中的点(噪声或者背景点): 任何不是核心点或者边界点的点

特点 : 发现任意形状的簇、对噪声数据不敏感、一次扫描、需要密度参数作为停止条件,计算量大和复杂度高 。

    DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。

    通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

    前面我们定性描述了密度聚类的基本思想,在这里我们就看看DBSCAN是如何描述密度聚类的。DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵϵ描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵϵ的邻域中样本个数的阈值。

    假设我们的样本集是D=(x1,x2,...,xm)(x1,x2,...,xm),则DBSCAN具体的密度描述定义如下:

        1) ϵϵ-邻域:对于xj∈Dxj∈D,其ϵϵ-邻域包含样本集D中与xjxj的距离不大于ϵϵ的子样本集,即Nϵ(xj)=xi∈D|distance(xi,xj)≤ϵNϵ(xj)=xi∈D|distance(xi,xj)≤ϵ, 这个子样本集的个数记为|Nϵ(xj)||Nϵ(xj)|

        2)核心对象:对于任一样本xj∈Dxj∈D,如果其ϵϵ-邻域对应的Nϵ(xj)Nϵ(xj)至少包含MinPts个样本,即如果|Nϵ(xj)|≥MinPts|Nϵ(xj)|≥MinPts,则xjxj是核心对象。

        3)密度直达:如果xixi位于xjxj的ϵϵ-邻域中,且xjxj是核心对象,则称xixi由xjxj密度直达。注意反之不一定成立,即此时不能说xjxj由xixi密度直达, 除非且xixi也是核心对象。

        4)密度可达:对于xixi和xjxj,如果存在样本样本序列p1,p2,...,pTp1,p2,...,pT,满p1=xi,pT=xjp1=xi,pT=xj, 且pt+1pt+1由ptpt密度直达,则称xjxj由xixi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,...,pT−1p1,p2,...,pT−1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。

       5)密度相连:对于xixi和xjxj,如果存在核心对象样本xkxk,使xixi和xjxj均由xkxk密度可达,则称xixi和xjxj密度相连。注意密度相连关系是满足对称性的。

   从下图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其ϵϵ-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵϵ-邻域内所有的样本相互都是密度相连的。

    DBSCAN的聚类定义很简单: 由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇 。

    这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里面其他的非核心对象样本都在这个核心对象的ϵϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵϵ-邻域中一定有一个其他的核心对象,否则这个核心对象无法密度可达。这些核心对象的ϵϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

       那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。基本上这就是DBSCAN算法的主要内容了,但是我们还有三个问题没有考虑。

    1)一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象的周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。

    2)距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,比如样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。

    3)某些样本可能到两个核心对象的距离都小于ϵϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如何界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法。

DBSCAN通过检查数据集中的每个对象的ε-邻域来寻找聚类,如果一个点p的ε-邻域包含对于m个对象,则创建一个p作为核心对象的新簇。然后,DBSCAN反复地寻址这些核心对象直接密度可达的对象,这个过程可能涉及密度可达簇的合并。当没有新的点可以被添加到任何簇时,该过程结束。算法中的ε和m是根据先验只是来给出的。

DBSCAN聚类算法原理的基本要点:

    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的值,下面的算法实现过程中,我们会详细说明。

对于算法的实现,我们概要地描述一下实现的过程:

    1.解析样本数据文件。

    2.计算每个点与其他所有点之间的欧几里得距离。

    3.计算每个点的k-距离值,并对所有点的k-距离集合进行升序排序,输出的排序后的k-距离值。

    4.将所有点的k-距离值,在Excel中用散点图显示k-距离变化趋势

    5.根据散点图确定半径Eps的值

    6.根据给定MinPts=4,以及半径Eps的值,计算所有核心点,并建立核心点与核心点距离小于半径Eps的点映射。

    7.根据得到的核心点集合,以及半径Eps的值,计算能够连通的核心点,并得到离群点。

    8.将能够连通的每一组核心点,以及到核心点距离小于半径Eps的点,都放到一起,形成一个簇。

    9.选择不同的半径Eps,使用DBSCAN算法聚类得到的一组簇及其离群点,使用散点图对比聚类效果。

    和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数K,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。

    那么我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。 如果数据集不是稠密的,则不推荐用DBSCAN来聚类 。

    优点:

        1)可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。不用指明类别的数量,能灵活找到并分离各种形状和大小的类。能很好地处理噪声和离群点。

        2)可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

        3)聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

    缺点:

         1)在不同密度的类方面有一定难度。如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合( HDBSCAN适合密度不均匀问题 )。

        2)如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻近时建立的KD树或者球树进行规模限制来改进。当数据量增大时,要求较大的内存支持I/O消耗也很大;算法聚类效果依赖与距离公式选取,实际应用中常用欧式距离,对于高维数据,存在“维数灾难”。

        3)调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ϵϵ,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

        4)对于从两类均可达的边界点,由于各个点是被随机访问的,因此DBSCAN不能保证每次都返回相同的聚类。

    DBSCAN类的重要参数分为两类,一类是DBSCAN算法本身的参数,一类是最近邻度量的参数,下面我们对这些参数做一个总结。

    1) eps: DBSCAN算法参数,即我们的ϵ-邻域的距离阈值,和样本距离超过ϵ的样本点不在ϵ-邻域内。 默认值是0.5 ,一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少,本来不应该是一类的样本也会被划分为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。

   2) min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值。默认值是5。一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

    3) metric: 最近邻距离度量参数。可以使用的距离度量比较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离量度参数有:欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、带权重闵可夫斯基距离、标准化欧式距离、马氏距离。

还有一些其他不是实数的距离度量,一般在DBSCAN算法用不上,这里也就不列了。

    4)algorithm:最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。这三种方法与K近邻法(KNN)原理中算法一致。对于这个参数,一共有4种可选输入,"brute"对应第一种蛮力实现,"kd_tree"对应于第二种KD树实现,"ball_tree"对应于第三种的球树实现,"auto"则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。 需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后sklearn都会去用蛮力实现"brute" 。个人的经验,一般情况使用默认的"auto"就够了。如果数据量很大或者特征也很多,用“auto”建树时间可能会很长,效率不高,建议选择KD树实现“kd_tree”,此时如果发现"kd_tree"速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用"ball_tree"。

    5) leaf_size :最近邻搜索算法参数,为使用KD树或者球树时,停止建子树的叶子节点数量的阈值。这个值越小,则生成的KD树或者球树就越大,层数越深,建树时间越长,反之,则生成的KD树或者球树会小,层数较浅,建树时间较短。默认是30,因为这个值一般只影响算法是运行速度和使用内存大小,因此一般情况下可以不管它。

    6) p :最近邻距离度量参数。只有用于闵可夫斯基距离和带权重闵客服斯基距离中p值的选择,p=1为曼哈顿距离,p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。

以上就是DBSCAN类的主要参数介绍,其实需要调参的就是两个参数eps和min_samples,这两个值的组合对最终的聚类效果有很大的影响。

DBSCAN密度聚类算法

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。下面我们就对DBSCAN算法的原理做一个总结。

一、密度聚类原理

    DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。

    通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

二、DBSCAN密度定义

    在上一节我们定性描述了密度聚类的基本思想,本节我们就看看DBSCAN是如何描述密度聚类的。DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(\\(\\epsilon\\), MinPts)用来描述邻域的样本分布紧密程度。其中,\\(\\epsilon\\)描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为\\(\\epsilon\\)的邻域中样本个数的阈值。

    假设我的样本集是D=\\((x_1,x_2,...,x_m)\\),则DBSCAN具体的密度描述定义如下:

    1) \\(\\epsilon\\)-邻域:对于\\(x_j \\in D\\),其\\(\\epsilon\\)-邻域包含样本集D中与\\(x_j\\)的距离不大于\\(\\epsilon\\)的子样本集,即\\(N_\\epsilon(x_j) = \\x_i \\in D | distance(x_i,x_j) \\leq \\epsilon\\\\), 这个子样本集的个数记为\\(|N_\\epsilon(x_j)|\\) 

    2) 核心对象:对于任一样本\\(x_j \\in D\\),如果其\\(\\epsilon\\)-邻域对应的\\(N_\\epsilon(x_j)\\)至少包含MinPts个样本,即如果\\(|N_\\epsilon(x_j)| \\geq MinPts\\),则\\(x_j\\)是核心对象。 

    3)密度直达:如果\\(x_i\\)位于\\(x_j\\)\\(\\epsilon\\)-邻域中,且\\(x_j\\)是核心对象,则称\\(x_i\\)\\(x_j\\)密度直达。注意反之不一定成立,即此时不能说\\(x_j\\)\\(x_i\\)密度直达, 除非且\\(x_i\\)也是核心对象。

    4)密度可达:对于\\(x_i\\)\\(x_j\\),如果存在样本样本序列\\(p_1, p_2,...,p_T\\),满足\\(p_1 = x_i, p_T = x_j\\), 且\\(p_t+1\\)\\(p_t\\)密度直达,则称\\(x_j\\)\\(x_i\\)密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本\\(p_1, p_2,...,p_T-1\\)均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。

    5)密度相连:对于\\(x_i\\)\\(x_j\\),如果存在核心对象样本\\(x_k\\),使\\(x_i\\)\\(x_j\\)均由\\(x_k\\)密度可达,则称\\(x_i\\)\\(x_j\\)密度相连。注意密度相连关系是满足对称性的。

    从下图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其\\(\\epsilon\\)-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的\\(\\epsilon\\)-邻域内所有的样本相互都是密度相连的。

技术图片

    有了上述定义,DBSCAN的聚类定义就简单了。

三、DBSCAN密度聚类思想

    DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。

    这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的\\(\\epsilon\\)-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的\\(\\epsilon\\)-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的\\(\\epsilon\\)-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

    那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。

    基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。

    第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。

    第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。如果大家对于最近邻的思想,距离度量,KD树和球树不熟悉,建议参考之前写的另一篇文章K近邻法(KNN)原理小结

    第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于\\(\\epsilon\\),但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法。

四、DBSCAN聚类算法

    下面我们对DBSCAN聚类算法的流程做一个总结。

    输入:样本集D=\\((x_1,x_2,...,x_m)\\),邻域参数\\((\\epsilon, MinPts)\\), 样本距离度量方式

    输出: 簇划分C. 

    1)初始化核心对象集合\\(\\Omega = \\emptyset\\), 初始化聚类簇数k=0,初始化未访问样本集合\\(\\Gamma\\) = D, ?簇划分C = \\(\\emptyset\\)

    2) 对于j=1,2,...m, 按下面的步骤找出所有的核心对象:

      a) 通过距离度量方式,找到样本\\(x_j\\)\\(\\epsilon\\)-邻域子样本集\\(N_\\epsilon(x_j)\\)

      b) 如果子样本集样本个数满足\\(|N_\\epsilon(x_j)| \\geq MinPts\\), 将样本\\(x_j\\)加入核心对象样本集合:\\(\\Omega = \\Omega \\cup \\x_j\\\\)

    3)如果核心对象集合\\(\\Omega?= \\emptyset\\),则算法结束,否则转入步骤4.

    4)在核心对象集合\\(\\Omega\\)中,随机选择一个核心对象\\(o\\),初始化当前簇核心对象队列\\(\\Omega_cur = \\o\\\\), 初始化类别序号k=k+1,初始化当前簇样本集合\\(C_k = ?\\o\\\\), 更新未访问样本集合\\(\\Gamma = \\Gamma - ?\\o\\\\)

    5)如果当前簇核心对象队列\\(\\Omega_cur = \\emptyset\\),则当前聚类簇\\(C_k\\)生成完毕, 更新簇划分C=\\(\\C_1,C_2,...,C_k\\\\), 更新核心对象集合\\(\\Omega = \\Omega - C_k\\),?转入步骤3。

    6)在当前簇核心对象队列\\(\\Omega_cur\\)中取出一个核心对象\\(o^'\\),通过邻域距离阈值\\(\\epsilon\\)找出所有的\\(\\epsilon\\)-邻域子样本集\\(N_\\epsilon(o^')\\),令$\\Delta = N_\\epsilon(o^‘) \\cap \\Gamma \\(, 更新当前簇样本集合\\)C_k =C_k \\cup \\Delta\\(, 更新未访问样本集合\\)\\Gamma = \\Gamma - \\Delta\\(,? 更新\\)\\Omega_cur = \\Omega_cur \\cup (\\Delta \\cap \\Omega) - o‘$,转入步骤5.

    输出结果为:?簇划分C=\\(\\C_1,C_2,...,C_k\\\\)

五、DBSCAN小结

    和传统的K-Means算法相比,DBSCAN最大的不同就是不需要输入类别数k,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH算法类似。

    那么我们什么时候需要用DBSCAN来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN会比K-Means聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN来聚类。

    下面对DBSCAN算法的优缺点做一个总结。

    DBSCAN的主要优点有:

    1) 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。

    2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

    3) 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

    DBSCAN的主要缺点有:

    1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。

    2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。

    3) 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值\\(\\epsilon\\),邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

?

(欢迎转载,转载请注明出处。欢迎沟通交流: 微信:nickchen121)?    

以上是关于聚类算法--DBSCAN的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法-密度聚类算法DBSCAN

DBSCAN密度聚类算法(理论+图解+python代码)

DBSCAN密度聚类算法

DBSCAN密度聚类算法

DBSCAN聚类算法原理总结

K-means与DBSCAN聚类算法