DBSCAN聚类算法概述
DBSCAN聚类算法是一个比较有代表性的基于密度的聚类算法。所谓密度,就是说样本的紧密程度对应其类别,属于同一个类别的样本是紧密相连的。DBSCAN聚类算法可以在噪声的空间数据库中发现任意形状的聚类。
DBSCAN聚类算法相关概念
在数据集中找一个点,以这个点为圆心,画一个指定半径的圆,在这个圆内的其他点就是与这个点密切的点,如果些点的数量达到一定的数量,也就是达到阈值,就可以认为这个点是核心点。
如果一个点在核心点的指定半径圆的这个范围内,那么就说这个点和核心点成为直接密度可达,如果有一系列的点都满足上一个点到这个点是直接密度可达,那么这个系列中不相邻的点就成为密度可达的。如果从一个点出发,得到两个密度可达的点,那么这两个点称为密度相连的。
如果一个点画了圆之后没有其他点了,那么这个点就成为这个类的边界点。
如果一个点从任何一个核心点出发都不能得到这个点,说明这个点不属于任何一个类,被称为噪声点。
举个例子核心点A的范围内存在点B,那么A和B就是直接密度可达,而C不在A的范围呢,但是以B为圆心进行画圆,C在B的范围内,那么B和C也是直接密度可达,而A和C就叫密度可达,同时A和C也是密度相连的。而C如果画圆之后范围内没有其他的点,那么就说明C是这个类的边界点,而如果还有一个点D不属于任何一个点画圈的范围内,而且他也不是核心点,那么就说D是噪声点。
DBSCAN聚类算法原理
先将所有的点进行标记,标记为为访问过,然后从数据集中抽取样本点,如果这个样本点是核心点,那么就从这个点出发,找到这个点的所有密度可达的点,这些点就是同一个类别,并且这些点被标记为已访问,然后再寻找下一个点,如果这个点不是核心点,那么就直接重新寻找下一个点,被标记为噪声点,不断重复这个过程,直到所有的点都被处理过。
举个例子,一个公司是属于一个类,老板的直接下属是总经理,然后各个总经理的下属是主管,各个主管的下属是组长,各个组长的下属是普通员工。从这家公司的老板开始,画了一个圆圈中了所有总经理,那么老板和这些总经理是同一个类的,然后从各个总经理进行画圆,又权重了各个主管,那么老板和各个总经理以及各个总经理的各个主管是同一给类的,以此类推,直到普通员工无法再圈到其他人,那么这个类别就分类结束了。然后到开始处理下一个点,下一个点可能是第二家公司的总经理,又能圈到了第二家公司的老板以及主管,第二家公司的老板又能圈到其他的总经理,依此类推,又得到了另一个类别。
半径和阈值的设置
DBSCAN聚类算法的核心就是设置半径和阈值,而半径大多数是根据距离来设置的,随机在数据集中找一个点,计算出到其他所有点的距离,从小到大进行排序,之后在距离值中找一个突变点,所谓突变点就是一个拐点,比如说一开始的距离增长是比较平稳的,然后突然有一个值增长的比较快或者明显,那么这个点就是突变点,就可以用这个突变点的前一个值或者跟前一个值进行求平均而作为半径。而阈值的选取基本上是一个比较小的值,需要进行多次尝试进行比较,从而得到一个合适的值。通常半径和阈值都是一个比较小的值。
DBSCAN聚类算法的优缺点
优点:
1.不需要认为指定划分的个数,而是通过计算过程自动分出来。
2.非常擅长找离群点。
3.可以处理任意形状的数据集。
缺点:
1.高维数据处理比较困难。
2.如果数据集密度不均匀,聚类间距相差很大时,聚类效果较差。
3.数据量大时,开销也很大,效率不过。
DBSCAN聚类算法代码
from sklearn.cluster import DBSCAN #引入DBSCAN聚类算法
clf= DBSCAN(eps=0.5,min_samples=10) #半径为0.5,阈值为10
clf.fit_predict(x_train) #进行训练只需要一个值
代码函数及参数说明见