DBSCAN

本文深入解析DBSCAN聚类算法,介绍其基于密度空间的特点,无需预设聚类数量,能有效处理任意形状的数据集。文章详细阐述了epsilon-neighborhood概念、核心参数epsilon与minPts的作用,以及如何划分核点、边缘点和离群点。最后,概述了DBSCAN算法的具体执行步骤。

DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类。

1.epsilon-neighborhood
epsoiln-neighborhood(简称e-nbhd)可理解为密度空间,表示半径为e且含有若干个点的nbhd,密度等于包含点的个数/空间大小。图中中心点是(3,2),半径epsilon是0.5

根据式子密度=点的个数/面积,可以计算得到上图中密度=31/2pi(0.5)*(0.5)=62/pi,这个数字本身意义不大,但通过计算某一小区域的密度,横向对比可以得知整个区域的密度分布,由此相近的点可聚类到同一区域内。

2.DBSCAN
DBSCAN算法需要首先确定两个参数:
(1)epsilon:在一个点周围邻近区域的半径
(2)minPts:邻近区域内至少包含点的个数
根据以上两个参数,结合epsilon-neighborhood的特征,可以把样本中的点分成三类:

核点(core point):满足NBHD(p,epsilon)>=minPts,则为核样本点
边缘点(border point):NBHD(p,epsilon)<minPts,但是该点可由一些核点获得(density-reachable或者directly-reachable)
离群点(Outlier):既不是核点也不是边缘点,则是不属于这一类的点
注:边缘点density-reachable是指存在当前类中其他点作为核点所在的类中。例如,朋友的朋友(可以是n多个)也是朋友。如下图,黄圈右下角的点即为density-reachable,directly-reachable的点即为NBHD中的点。

3.DBSCAN步骤
结合2中内容,DBSCAN的一般步骤是:(在已知epsilon和minPts的前提下)

任意选择一个点(既没有指定到一个类也没有特定为外围点),计算它的NBHD(p,epsilon)判断是否为核点。如果是,在该点周围建立一个类,否则,设定为外围点。
遍历其他点,直到建立一个类。把directly-reachable的点加入到类中,接着把density-reachable的点也加进来。如果标记为外围的点被加进来,修改状态为边缘点。

05-21
### DBSCAN算法简介 DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度的经典聚类算法,最初由 M. Ester 等人在 1996 年提出[^2]。该算法的核心思想是通过识别数据点的密度区域来进行聚类,并能够有效处理噪声点。DBSCAN 的主要特点是不需要预先指定聚类的数量,并能发现任意形状的簇。 #### 主要参数 DBSCAN 算法有两个核心参数: - **Eps**: 邻域半径,表示某个点周围的最大距离。 - **MinPts**: 最小邻域点数,表示在给定半径范围内至少需要多少个点才能形成一个密集区。 #### 工作原理 DBSCAN 将数据点划分为三类: 1. **核心点**: 如果某一点在其邻域内(即以该点为中心、`Eps`为半径的区域内)有超过 `MinPts` 个点,则此点为核心点。 2. **边界点**: 不满足核心点条件但属于某一核心点的邻域内的点称为边界点。 3. **噪声点**: 既不属于任何核心点的邻域也不构成核心点的点被标记为噪声点。 算法流程如下: 1. 对于每一个未访问过的点 P,如果其周围的点数量大于等于 `MinPts`,则创建一个新的簇并加入这些点。 2. 查找新加入簇中每个点的邻域,继续扩展当前簇直到无法找到更多符合条件的点为止。 3. 若点 P 周围的点少于 `MinPts` 则将其视为噪声点。 4. 重复以上过程直至所有点都被分类完毕。 --- ### Python实现DBSCAN算法 以下是使用 Python 和 Scikit-Learn 库实现 DBSCAN 的示例: ```python from sklearn.cluster import DBSCAN import numpy as np # 创建样本数据 X = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]]) # 初始化DBSCAN对象 db = DBSCAN(eps=3, min_samples=2) # 训练模型 labels = db.fit_predict(X) print("Cluster Labels:", labels) ``` 在此代码片段中: - 参数 `eps=3` 表示设定的邻域半径为 3。 - 参数 `min_samples=2` 表示每个核心点的最小邻域点数为 2。 - 函数 `fit_predict()` 返回每个点所属的簇标签,其中 `-1` 表示噪声点。 此外,也可以手动实现 DBSCAN 算法而不借助第三方库[^4]。这种方式有助于深入理解算法的工作机制。 --- ### 改进方向 虽然 DBSCAN 性能在许多场景下表现出色,但也存在一些局限性以及相应的改进思路: - **固定邻域半径问题**: 可以引入自适应邻域半径策略,利用 k 近邻或其他局部密度估计方法动态调整 `Eps` 值[^1]。 - **高维数据挑战**: 使用降维技术(如 PCA 或 t-SNE)或将特征选择应用于输入数据,缓解维度灾难带来的影响。 - **参数选择复杂性**: 开发自动化工具辅助选取最佳 `Eps` 和 `MinPts` 组合,例如结合 K 距离图进行可视化分析。 - **大规模数据支持**: 结合索引结构(如 R 树或 KD 树)、分布式计算框架优化性能,应对海量数据需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值