1.基本概念
核心对象:若某个点的密度达到算法设定的阈值则其为核心点。(即 邻域内点的个数不少于minPts)
ε邻域的距离阈值:设定的半径ε。
直接密度可达:若某点p在q的 邻域内,且q是核心点则p-q直接密度可达。
密度可达:若有一个带你的序列q0、q1、…、qk,对任意qi-qi-1是直接密度可达的,责成从q0到qk密度可达,这实际上是直接密度可达的“传播”。
密度相连:若从某核心点出发,点q和点k都是密度可达的,则称点q和点k是密度相连的。
边界点:属于某一个类的非核心点,不能发展下线了。
噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达的。
举例说明:A表示核心对象、B和C表示边界点以及N表示离群点。
2.DBSCAN的思想
DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。
这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的ϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵ-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的ϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。
那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。
基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。
第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。
第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。
第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法。
3.工作流程
参数D:输入数据集
参数ε:指定半径
minPts:密度阈值
4.参数选择
半径ε :可以根据k距离来设定:找突变点。
K距离:给定数据集p={p(i);i=0,1,…,n},计算点p(i)到集合D的子集S中所有点之间的距离,距离按照从小到大的顺序排序,d(k)就被称为k距离。
minPts:k距离中k的值,一般取的小一些,多次尝试。
5.优劣势
(1)优势
①不需要指定簇的个数;
②可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集;
③擅长找到离群点(检测任务);
④两个参数εvarepsilonε和minPts就够了;
⑤聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。
(2)劣势
①高维数据有些困难;
②Sklearn中效率很慢(数据削减策略);
③如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合;
④调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值ε,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。