DBSCAN简介

1. 简介

1.1 常用聚类方法

1. 层次的方法(hierarchical method);

2. 划分方法(partitioning method);

3. 基于密度的方法(density-based method);

4. 基于网格的方法(grid-based method);

5. 基于模型的方法(model-based method)等。

1.2 定义

        DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,适用于发现具有不同密度点集的聚类,同时对于有噪声(即孤立点或异常值)的数据集也有很好的鲁棒性它不需要预先定义簇的个数,而是将具有足够高密度的区域划分为簇(并将其他区域视为噪声),并可在有噪声的数据中发现任意形状的簇,在此算法中将簇定义为密度相连的点的最大集合。(能够识别和剔除噪声点)

DBSCAN用作异常检测的思想是找到样本空间中处在低密度的异常样本,不属于任何聚类。

        在聚类问题中,如果数据集的各类呈球形分布,可以采用kmeans聚类算法,如果各类数据呈非球形分布(如环形、条形),使用DBSCAN聚类算法更为合适(kmeans效果将大打折扣)。

        特点:

1. 基于密度,对远离密度核心的噪声点鲁棒,单独划分为一个簇

2. 无需事前知道聚类簇的数量;

3. 可以发现任意形状的聚类簇。

1.3 核心概念

1.3.1 1个思想:

        DBSCAN算法最核心的思想就是基于密度,DBSCAN可以找到样本点的全部密集区域,并把这些密集区域当做一个个的聚类簇。

      可以简单的理解该算法是基于密度的一种生长,和病毒的传染差不多,只要密度够大,就能传染过去,遇到密度小的,就停止传染。

1.3.2 2个参数:

1. 邻域半径(Eps):用来定义一个样本点邻域范围的最大半径。一个点的邻域包括其本身及在其 Eps 距离内的所有样本点。Eps越大,邻域会包含更多的数据,聚簇也就越大。

2. 最小点数(MinPts):在一个邻域的半径内最少要有的样本数。

1.3.3 3种类别:

1. 核心点(Core Point):在邻域半径 Eps 内含有超过(>=) MinPts 数目的数据点。如果一个点 p 在距离 Eps 范围内有至少 MinPts 个点(包括自己),则这个点被称为核心点。核心点对应稠密区域内部的点。

2. 边界点(Border Point):如果一个数据点在其邻域内的点的数量小于 MinPts,但它位于某个核心点的邻域内,则该数据点为边界点。边界点对应稠密区域边缘的点。

3. 离群点(Noise Point) -- 噪声点:如果一个点既不是核心点也不是边界点,即它周围的邻居点数量不足以形成一个簇,并且它也不在任何核心点的邻域内,那么它被标记为噪声点。离群点对应稀疏区域中的点。

以下图为例,假定最小点数 MmPtS=5,则:

  • 点 A 为核心点,其Eps邻域内超过了5个点;
  • 点 B 为边界点,其Eps邻域内小于5个点,且落在了点A的Eps邻域内;
  • 点 C 为离群点,其Eps邻域内小于5个点,且没有落在任何核心点的邻域内。

1.3.4 4种关系:

1. 密度直达:如果点p在核心点q的Eps邻域内,则称q到p是密度直达的(不具有对称性)。

2. 密度可达:如果存在数据链<p_{1},p_{2},...,p_{n}​>,且P1到P2密度直达,P2到P3密度直达,...,P(n-1)到Pn密度直达,则P1到Pn密度可达,密度可达也不具有对称性。(需满足样本序列中每一对都密度直达);

3. 密度相连:如果存在核心点o,使o到p和q均密度可达,则称p和q密度相连,密度相连具有对称性。(密度相连的两个点属于同一个聚类簇)

4. 非密度相连。

1.3.5 拓展概念:

1. Eps 领域:与点的距离小于等于Eps的所有点的集合。

2. 密度聚类簇:由一个核心点和与其密度可达的所有数据点构成一个密度聚类簇。以下图为例,点 a 为核心点,点 b 为边界点,并且因为 a 密度直达 b。但是 b 不密度直达 a(因为 b 不是一个核心点)。因为 c 密度直达 a,a 密度直达 b,所以 c 密度可达 b。但是因为 b 不密度直达 a,所以 b 不密度可达 c。但是 b 和 c 密度相连。


  3. 聚类扩展:从任意未被访问的核心点开始,以及其可达的点(核心点、边界点),将它们标记为一个新的聚类。这个过程一直持续到所有的核心点和边界点都被访问。

        DBSCAN的聚类过程就是根据核心点来推导出最大密度相连的样本集合,首先随机寻找一个核心样本点,按照minPoints和eps来推导其密度相连的点,赋予一个cluser编号,然后再选择一个没有赋予类别的核心样本点,开始推导其密度相连的样本结合,一直迭代到所有的核心样本点都有对应的类别为止。

1.4 原理

        基于一组邻域参数(eps,MinPts)进行刻画,包括邻域,核心对象(邻域内至少包含MinPts个对象),密度直达,密度可达,密度相连,先找出样本中所有的核心对象,然后以任一核心对象作为出发点,找出由其密度可达的样本生成聚类簇,直到所有核心对象被访问过为止。

2. 算法流程

        DBSCAN 聚类本质上是将密度相连的样本点划分到同一个簇中。当簇内存在多个核心点时,簇内任意一个核心点的邻域内必定包含另一个核心点,否则它们之间无法建立密度可达关系。这些核心点的 Eps 邻域内的所有样本集合则形成了一个DBSCAN 聚类簇。算法步骤比较简单,主要分成两步:

1. 寻找核心点形成临时聚类簇

      扫描全部样本点,如果某个样本点eps半径范围内点数目>=MinPoints,则将其纳入核心点列表,并将其密度直达的点形成对应的临时聚类簇。

2. 合并临时聚类簇得到聚类簇

      对于每一个临时聚类簇,检查其中的点是否为核心点,如果是,将该点对应的临时聚类簇和当前临时聚类簇合并,得到新的临时聚类簇。

      重复此操作,直到当前临时聚类簇中的每一个点要么不在核心点列表,要么其密度直达的点都已经在该临时聚类簇,该临时聚类簇升级成为聚类簇。继续对剩余的临时聚类簇进行相同的合并操作,直到全部临时聚类簇被处理。反复寻找这些核心点直接密度可达或密度可达的点,将其加入到相应的类,对于核心点发生密度可达状况的类,给予合并。

1. 找到每个样本的邻域内的样本个数,若个数>=MinPts,则该样本为核心点;

2. 找到每个核心样本密度直达和密度可达的样本,且该样本亦为核心样本,忽略所有的非核心样本;

3. 若非核心样本在核心样本的邻域内,则非核心样本为边界样本,反之为噪声。

具体算法流程:

1. 初始化:输入参数包括数据集 D,邻域半径阈值 eps,样本点最小个数阈值 MinPts;

2. 对数据集中所有对象进行标记:如果一个点的邻域中的点的个数不小于 MinPts,则该点被标记为核心点;如果一个点的邻域中的点的个数小于 MinPts,但其仍然在某个核心点的邻域内,则该点被标记为边界点;否则,该点被标记为噪声点;

3. 从任意一个未访问的核心点开始,利用核心点的可达性,递归遍历该核心点的所有密度可达点,并将其加入到一个簇中,直到一个簇被完全遍历完成;

4. 不断寻找核心点,不断寻找并扩展新的簇;

5. 直到所有的核心点均被访问过后,聚类结束。

    1. 初始化:将所有点标记为未访问状态。
    2. 对每个点进行检查:
        (1)如果点已被访问,则跳过;
        (2)如果点是核心点,以其为起点开始扩展聚类;
        (3)如果点是噪声点,标记为已访问。
    3. 聚类扩展(expandCluster):
            从核心点开始,通过邻居点进行扩展。将可达的核心点和边界点标记为同一个聚类,直到所有可达点都被访问。
    4. 标记噪声点:
            将未被访问的噪声点标记为已访问。

总结:

        DBSCAN 算法根据核心点和它们的密度可达性来形成簇。算法从任意数据点开始,若其 Epsilon 邻域内包含至少 minPts 个数据点,则形成一个新的簇并将相应的点标记为核心点。接下来,算法遍历这些核心点的邻域,如果核心点的邻居也是核心点,则将它们相互连接并将簇扩展。当没有新的核心点可以添加到簇时,算法查找新的未处理的数据点并重复这个过程,直到所有数据点都已处理。

        DBSCAN 核心思想是基于密度的聚类,通过寻找密度相连的点来划分簇。它能够识别出具有不同密度的簇,并且对噪声点有一定的鲁棒性。但是对于高维数据和不规则形状的聚类效果可能有所不足。

3. 优缺点

3.1 优点

1. 相比K-Means,不需要预先声明聚类数量

2. 可以对任意形状的稠密数据集进行聚类,而k-means之类的聚类算法一般只适用于凸数据集;
2. 可以在聚类的同时发现异常点,对数据集中的异常点不敏感;
3. 聚类结果没有偏倚,而 k-means 之类的聚类算法的初始值对聚类结果有很大影响。

3.2 缺点

1. 样本集密度不均匀(具有不同密度的簇)、聚类间距差相差很大时,聚类质量较差,此时DBSCAN一般不适合;
2. 样本集较大时,聚类收敛时间较长,(算法要对数据集中的每个样本都进行计算),此时可以对搜索最近邻时建立的 KD 树或者球树进行规模限制来进行改进;
3. 调参比较复杂(相对于传统的K-Means之类的聚类算法),主要需要对距离阈值 Eps,邻域样本数阈值 MinPts 进行联合调参,不同的参数组合对最后的聚类效果有较大影响,对参数eps和MinPts的设置是非常敏感的;

4. 作为异常检测时,并没有异常程度,只有一个标签,是否异常;
5. 对于整个数据集只采用了一组参数。如果数据集中存在不同密度的簇或者嵌套簇,则该算法不能处理;为了解决这个问题,有人提出了 OPTICS 算法。
6. DBSCAN 算法可过滤噪声点,这同时也是其缺点,这造成了其不适用于某些领域,如对网络安全领域中恶意攻击的判断。

4. 与Kmeans算法对比

1. 对异常值的影响:KMeans容易受到异常值的影响。在算法遍历质心时,离群值对质心的移动方式有显著的影响。而DBSCAN的密度定义也使其对异常值相对不敏感。

2. 数据精确聚类能力:在集群大小和密度不同的情况下,KMeans存在数据精确聚类的问题。它只能应用于球形簇,对于非球形簇处理不好;而DBSCAN在任意形状和大小的集群中工作得非常好。

3. 聚类数指定:KMeans要求我们首先选择希望找到的集群的数量,而DBSCAN则不需要决定聚类数,不必手动调参。

4. 算法原理:KMeans使用重复的质心重新分配法,将数据点分配到最近的质心,形成簇;DBSCAN使用密度定义,聚类簇是通过将相邻的点连接在一起的过程形成的

5. 能够找到异常点的能力DBSCAN可以发现异常点,而KMeans没有这个能力。

5. 最优参数确定

5.1 如何确定最优的邻域半径Eps值?

         如果eps取值太小,部分样本会被误认为是噪声点(白色);eps取值太大,大部分样本会合并为同一簇类。

        常采用k-距离曲线图的方法:通过计算每个点到其k近邻点的距离,绘制K-Distance图。则曲线拐点对应的距离即为最优Epsilon值。Knee Point是K Distance图中最陡峭的部分,意味着陡峭度显著下降。

详细步骤如下:

1. 为每个点计算与其他所有点之间的距离,并将其排序;

2. 对于每个数据点,确定距离第 K 个最近的邻居的距离。通常,K 值的选择取决于数据的维数。较小的 K 值适用于较低维度数据,而较大的 K 值可以用于较高维度数据;

3. 绘制一个 K-距离图,即将各个数据点的 K-距离(Y轴)与按序排列的数据点(X轴)作图。此图像将帮助确定 Epsilon 的值;

4. 在 K-距离图上寻找一个“拐点(elbow)”,即图形中曲线的一个突出的折点。这个拐点对应于一个距离值(也就是横坐标值),被认为是最优的 Epsilon 值;

拐点所在位置通常对应密度变化最大的区域,在这个 Epsilon 值处,陡增的距离值表明密度区域的边界较明确,较适合进行聚类。

        样本点第k个近邻距离值小于eps归为簇类,大于eps的样本点归为噪声点。根据经验,一般选择eps值=第(minPts-1)的距离,计算样本间的距离前需要对数据进行归一化,使所有特征值处于同一尺度范围,有利于eps参数的设置。

如果(k+1)-距离曲线和k-距离曲线没有明显差异,那么minPts设置为k值。例如k=4和k>4的距离曲线没有明显差异,而且k>4的算法计算量大于k=4的计算量,因此设置MinPts=4。

5.2 如何确定最优的MinPts值?

        若MinPts值过小,则所有样本都可能为核心样本;MinPts值过大,部分样本会被误认为是噪声点(白色),如下图:

        确定 DBSCAN 最优 minPts(Minimum Points)值通常依赖于数据和领域知识。下面总结了一些常用的方式可以在不损失聚类效果的前提下选择 minPts 的值。

1. 维度依赖:minPts 值的选择与数据的维度有关。一个常用的经验公式是 minPts ≥ D + 1,其中 D 是数据的维度。对于更高维度的数据,可以考虑增加 minPts 的值。这是因为在高维空间中,点的密度可能会更分散,需要更多的邻居点来定义一个簇。

1. 若minPts=1,含义为所有数据集样本都为核心样本,即每个样本都是一个簇类;

2. 若minPts≤2,结果和单连接的层次聚类相同;

3. 因此minPts必须>=3,因此一般认为minPts=2*dim,若数据集越大,则minPts的值选择的亦越大。

2. 基于 Epsilon 的选择:在确定了最优 Epsilon 值后,可以尝试细化 minPts 的值。较小的 minPts 可能会导致比较大的噪声量,而较大的 minPts 则可能导致簇过于分散。可以尝试不同的 minPts 值,使用诸如轮廓系数、Calinski-Harabasz 指数等聚类评估指标进行比较,找出最优的 minPts 值。

3. 领域知识:在特定应用领域,根据对数据的实际理解,可以确定一个恰当的 minPts 值。例如,在生物学或地球科学领域,研究者可能会根据数据特征和具体问题,选择合适的参数值。

参考:https://www.cnblogs.com/zhangyang520/p/10969940.html

6. 算法复杂度

6.1 时间复杂度 -- 最低O(nlogn)

        如果使用简单的线性搜索来查询 Epsilon 邻域内的邻居,那么 DBSCAN 的时间复杂度为 O(n^2)。在这种情况下,计算每个数据点之间的距离需要 O(n^2) 时间,寻找邻居的时间同样为 O(n^2)。然而,使用高效的空间索引数据结构(如 k-d 树、Ball 树、R*-tree 等)可以将 Epsilon 邻域查询的时间复杂度降低到 O(nlogn)。在这种情况下,DBSCAN 算法的总体时间复杂度为 O(nlogn)。

6.2 空间复杂度 -- 最低O(n)

        DBSCAN 算法需要保存输入数据,距离矩阵以及每个点的邻居信息。空间复杂度同样取决于空间索引数据结构。对于基本实现(无空间数据结构),空间复杂度为 O(n)。使用某些空间索引数据结构后,DBSCAN 的空间复杂度可能为 O(n*logn)。空间复杂度与选择的数据结构和数据分布有关。

7. 如何解决噪声和离群点?

        DBSCAN算法是一种密度聚类算法,它能够有效地处理噪声和离群点,它将数据点分为核心对象、边界点和噪声点三个类型。对于噪声点,DBSCAN算法直接将它们排除在所有簇的范畴之外。因为噪声点没有密度可达的邻居,对聚类结果没有影响。

8. 优化和改进的方法

1. 空间索引数据结构:使用高效的空间索引结构(如 k-d 树、Ball 树、R*-tree 等)可以加速邻居查询,降低时间复杂度。这类优化方法通过减少重复计算和索引数据点的空间分布来提高查询性能。

2. 自适应 Epsilon 和 minPts:对于密度不同的簇,固定的 Epsilon 和 minPts 参数可能不适用。针对这个问题,一些自适应的 DBSCAN 变体(如 Variable Eps-DBSCAN、AUTO-DBSCAN等)被提出。这些算法根据数据分布和局部密度动态调整 Epsilon 和 minPts 值。

3. 处理高维数据:传统的 DBSCAN 在高维数据中可能会受到“维数灾难”的影响。为了解决这个问题,一些变体(如 HDBSCAN、OPTICS 等)被提出。它们通过引入基于核密度的概念、层次聚类、聚类顺序等方法,提高了在高维数据场景下的性能。

4. 并行化与分布式实现:为加速 DBSCAN 的执行速度,可以采用并行或分布式的实现方法。例如,通过 MPI、Apache Spark 或 GPU 来进行并行计算。这些方法一般适用于大规模数据集,可以提高计算性能,缩短执行时间。

5. 数据预处理和降维:在某些情况下,可以通过对数据进行预处理(如去除冗余特征或异常值)或降维技术(如主成分分析、t-SNE 等)来简化数据结构并提高算法性能。在某些特定领域,也可以根据领域知识执行特定的预处理步骤。

9. 算法应用

1. 构造函数

sklearn.cluster.DBSCAN(eps=0.5, *,  # 邻域的距离阈值
    min_samples=5, 
    metric='euclidean',  # 度量方式,默认为欧式距离
    metric_params=None, 
    algorithm='auto',  # 近邻算法求解方式:(brute:蛮力实现,kd_tree:KD树实现,ball_tree:球树实现)
    leaf_size=30,  # 使用tree时,停止建子树的叶子节点数量的阈值
    p=None, 
    n_jobs=None)

2. 属性

core_sample_indices_ :  # 核心点的索引
components_: # 训练样本的核心点
labels_: # 每个点所属集群的标签,也就是聚类的编号,-1代表噪声点

3. demo

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
# 生成随机簇类数据,样本数为600,类别为5
X, y = make_blobs(random_state=170, n_samples=600, centers=5)
dbscan = DBSCAN(eps=1, min_samples=4)  # 按照经验MinPts=2*dims,因此设为4
clusters = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap="plasma")
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.title("eps=0.5, minPts=4")
plt.show()
# 性能评价指标ARI
from sklearn.metrics.cluster import adjusted_rand_score
print("ARI=", round(adjusted_rand_score(y, clusters), 2))

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值