DBSCAN(Density-Based Spatial Clustering of Applications with Noise
,具有噪声的基于密度的空间聚类方法)是一种很典型的密度聚类算法,和 K-Means
, BIRCH
这些一般只适用于凸样本集的聚类相比,DBSCAN
既可以适用于凸样本集,也可以适用于非凸样本集。
DBSCAN
是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间是紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。
通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。
在上一小节我们定性描述了密度聚类的基本思想,本节我们就看看DBSCAN
是如何描述密度聚类的。DBSCAN
是基于一组邻域来描述样本集的紧密程度的,参数( ϵ \epsilon ϵ, MinPts
)用来描述邻域的样本分布紧密程度。其中, ϵ \epsilon ϵ 描述了某一样本的邻域距离阈值,MinPts
描述了某一样本的距离为 ϵ \epsilon ϵ 的邻域中样本个数的阈值。
假设我的样本集是 D = ( x 1 , x 2 , . . . , x m ) D=(x_1, x_2, ..., x_m) D=(x1,x2,...,xm) ,则DBSCAN
具体的密度描述定义如下:
MinPts
个样本,即如果 ∣ N ϵ ( x j ) ∣ ≥ M i n P t s |N_{\epsilon}(x_j)| \geq MinPts ∣Nϵ(xj)∣≥MinPts,则 x j x_j xj 是核心对象;从下图可以很容易理解上述定义,图中 MinPts=5
,红色的点都是核心对象,因为其 ϵ \epsilon ϵ - 邻域至少有 5
个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的 ϵ \epsilon ϵ - 邻域内所有的样本相互都是密度相连的。
有了上述定义,DBSCAN
的聚类定义就简单了。
DBSCAN
的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。
这个DBSCAN
的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的 ϵ \epsilon ϵ -邻域里;如果有多个核心对象,则簇里的任意一个核心对象的 ϵ \epsilon ϵ -邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的 ϵ \epsilon ϵ -邻域里所有的样本的集合组成的一个DBSCAN
聚类簇。
那么怎么才能找到这样的簇样本集合呢?DBSCAN
使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。
基本上这就是DBSCAN
算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。
第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象的周围,在DBSCAN
中,我们一般将这些样本点标记为噪音点。
第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN
中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN
分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD-tree
或者ball-tree
来快速的搜索最近邻。
第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于 ϵ \epsilon ϵ ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN
采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN
的算法不是完全稳定的算法。
输入:样本集 D = ( x 1 , x 2 , . . . , x m ) D = (x_1, x_2, ..., x_m) D=(x1,x2,...,xm),邻域参数( ϵ \epsilon ϵ ,MinPts
),样本距离度量方式。
输出: 簇划分(样本所属类别) C C C 。
输出结果为: 簇划分 C = { C 1 , C 2 , . . . , C k } C = \{C_1, C_2, ..., C_k\} C={C1,C2,...,Ck} 。
和传统的 K-Means
算法相比,DBSCAN
最大的不同就是不需要输入类别数k
,当然它最大的优势是可以发现任意形状的聚类簇,而不是像K-Means
,一般仅仅使用于凸的样本集聚类。同时它在聚类的同时还可以找出异常点,这点和BIRCH
算法类似。
那么我们什么时候需要用DBSCAN
来聚类呢?一般来说,如果数据集是稠密的,并且数据集不是凸的,那么用DBSCAN
会比K-Means
聚类效果好很多。如果数据集不是稠密的,则不推荐用DBSCAN
来聚类。
DBSCAN
的主要优点有:
① 可以对任意形状的稠密数据集进行聚类,相对的,K-Means
之类的聚类算法一般只适用于凸数据集。
② 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
③ 聚类结果没有偏倚,相对的,K-Means
之类的聚类算法初始值对聚类结果有很大影响。
DBSCAN
的主要缺点有:
① 如果样本集的密度不均匀、聚类间距相差很大时,聚类质量较差,这时用DBSCAN
聚类一般不适合。
② 如果样本集较大时,聚类收敛时间较长,此时可以通过在搜索最近邻时建立的KD-tree
或者ball-tree
进行规模限制来改进。
③ 调参相对于传统的K-Means
之类的聚类算法稍复杂,主要需要对距离阈值 ϵ \epsilon ϵ ,邻域样本数阈值 M i n P t s MinPts MinPts 联合调参,不同的参数组合对最后的聚类效果有较大影响。
① DBSCAN密度聚类算法 - 刘建平