DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。下面我们就对DBSCAN算法的原理做一个总结。
1. 密度聚类原理DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。
通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。
2. 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的聚类定义就简单了。
3. DBSCAN密度聚类思想DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。
这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的$\epsilon$-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的$\epsilon$-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的$\epsilon$-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。
那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。
基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。
第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。