DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具备噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些通常只适用于凸样本集的聚类相比,DBSCAN既能够适用于凸样本集,也能够适用于非凸样本集。下面咱们就对DBSCAN算法的原理作一个总结。html
DBSCAN是一种基于密度的聚类算法,这类密度聚类算法通常假定类别能够经过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处必定有同类别的样本存在。算法
经过将紧密相连的样本划为一类,这样就获得了一个聚类类别。经过将全部各组紧密相连的样本划为各个不一样的类别,则咱们就获得了最终的全部聚类类别结果。数组
在上一节咱们定性描述了密度聚类的基本思想,本节咱们就看看DBSCAN是如何描述密度聚类的。DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(\(\epsilon\), MinPts)用来描述邻域的样本分布紧密程度。其中,\(\epsilon\)描述了某同样本的邻域距离阈值,MinPts描述了某同样本的距离为\(\epsilon\)的邻域中样本个数的阈值。微信
假设个人样本集是D=\((x_1,x_2,...,x_m)\),则DBSCAN具体的密度描述定义以下:post
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)|\) spa
2) 核心对象:对于任同样本\(x_j \in D\),若是其\(\epsilon\)-邻域对应的\(N_{\epsilon}(x_j)\)至少包含MinPts个样本,即若是\(|N_{\epsilon}(x_j)| \geq MinPts\),则\(x_j\)是核心对象。 3d
3)密度直达:若是\(x_i\)位于\(x_j\)的\(\epsilon\)-邻域中,且\(x_j\)是核心对象,则称\(x_i\)由\(x_j\)密度直达。注意反之不必定成立,即此时不能说\(x_j\)由\(x_i\)密度直达, 除非且\(x_i\)也是核心对象。htm
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\)密度相连。注意密度相连关系是知足对称性的。blog
从下图能够很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,由于其\(\epsilon\)-邻域至少有5个样本。黑色的样本是非核心对象。全部核心对象密度直达的样本在以红色核心对象为中心的超球体内,若是不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的\(\epsilon\)-邻域内全部的样本相互都是密度相连的。
有了上述定义,DBSCAN的聚类定义就简单了。
DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为咱们最终聚类的一个类别,或者说一个簇。
这个DBSCAN的簇里面能够有一个或者多个核心对象。若是只有一个核心对象,则簇里其余的非核心对象样本都在这个核心对象的\(\epsilon\)-邻域里;若是有多个核心对象,则簇里的任意一个核心对象的\(\epsilon\)-邻域中必定有一个其余的核心对象,不然这两个核心对象没法密度可达。这些核心对象的\(\epsilon\)-邻域里全部的样本的集合组成的一个DBSCAN聚类簇。
那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象做为种子,而后找到全部这个核心对象可以密度可达的样本集合,即为一个聚类簇。接着继续选择另外一个没有类别的核心对象去寻找密度可达的样本集合,这样就获得另外一个聚类簇。一直运行到全部核心对象都有类别为止。
基本上这就是DBSCAN算法的主要内容了,是否是很简单?可是咱们仍是有三个问题没有考虑。
第一个是一些异常样本点或者说少许游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,咱们通常将这些样本点标记为噪音点。
第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,通常采用最近邻思想,采用某一种距离度量来衡量样本距离,好比欧式距离。这和KNN分类算法的最近邻思想彻底相同。对应少许的样本,寻找最近邻能够直接去计算全部样本的距离,若是样本量较大,则通常采用KD树或者球树来快速的搜索最近邻。若是你们对于最近邻的思想,距离度量,KD树和球树不熟悉,建议参考以前写的另外一篇文章K近邻法(KNN)原理小结。
第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于\(\epsilon\),可是这两个核心对象因为不是密度直达,又不属于同一个聚类簇,那么若是界定这个样本的类别呢?通常来讲,此时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\}\)
和传统的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)