【AI深究】密度聚类(DBSCAN)全网最详细全流程详解与案例(附Python代码演示)| 数学定义与公式 | DBSCAN算法 | 实际案例与流程 | 代码实现 | 优、缺点分析

大家好,我是爱酱。继前两篇介绍了层次聚类和K均值聚类之后,本期我们聚焦于密度聚类(DBSCAN, Density-Based Spatial Clustering of Applications with Noise)。DBSCAN是一种强大的无监督聚类算法,能够识别任意形状的簇并自动检测异常点。本文将系统介绍DBSCAN的原理、数学表达、实际案例流程和Python代码实现,方便你直接用于技术文档和学习。

注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!


一、DBSCAN聚类的基本思想

DBSCAN通过密度的概念定义“簇”,无需提前指定簇数,能有效处理噪声和异常点。其核心思想是:密度高的区域形成簇,密度低的区域被视为噪声

关键概念

  • 核心点(Core Point):以该点为中心、半径为$\varepsilon$的邻域内,包含至少MinPts个点。

  • 边界点(Border Point):在核心点邻域内,但自身邻域内点数不足MinPts。

  • 噪声点(Noise Point):既不是核心点,也不是任何核心点邻域内的点。

  • 最小邻域点数(MinPts(Minimum Points)):一个点的 $\varepsilon$ 邻域内,被认为是“核心点”所需的最小点数(包括自身)。


二、数学定义与公式

1. $\varepsilon$邻域

N_\varepsilon(x) = \{y \mid \|x - y\| \leq \varepsilon\}

$N_\varepsilon(x)$ 表示点 $x$$\varepsilon$邻域。

2. 核心点判定

|N_\varepsilon(x)| \geq \text{MinPts}

如果点 $x$$\varepsilon$邻域内点数不少于MinPts,则$x$为核心点。

3. 密度可达与密度连接

  • 密度可达:若$y$$x$$\varepsilon$邻域内,且$x$为核心点,则$y$密度可达于$x$

  • 密度连接:若存在点$z$,使得$x$$y$都密度可达于$z$,则$x$$y$密度连接。


三、DBSCAN算法流程

  1. 参数选择:设定$\varepsilon$和MinPts。

  2. 遍历所有点,对每个未访问点:

    • 计算其$\varepsilon$邻域内的点数。

    • 若邻域内点数$\geq$MinPts,标记为核心点,创建新簇。

    • 将所有密度可达的点递归加入该簇。

    • 若邻域内点数$<$MinPts,暂时标记为噪声

  3. 重复,直到所有点被访问。

  4. 输出所有簇,未归属任何簇的点为噪声点。


四、实际案例与流程

示例数据

上面笼统的定义看完了,实际派的爱酱当然会给示例大家去更好理解DBSCAN。

假设有如下二维数据点:

$x$$y$
A12
B22
C23
D87
E88
F2580

我们设定参数$\varepsilon=1.5$,MinPts=2。


Step 1:计算邻域

  • $A$$\varepsilon$邻域:$B$(距离1),$C$(距离$\sqrt{2^2+1^2}=2.24$,不在邻域),只有$B$

  • $B$$\varepsilon$邻域:$A$(1),$C$(1),共2个点。

  • $C$$\varepsilon$邻域:$B$(1),$A$(2.24),只有$B$

  • $D$$\varepsilon$邻域:$E$(1),只有$E$

  • $E$$\varepsilon$邻域:$D$(1),只有$D$

  • $F$$\varepsilon$邻域:无其他点。


Step 2:判定核心点

  • $B$的邻域内有$A$$C$,共2个点(含自身3个),满足MinPts=2,是核心点

  • $A$$C$各自邻域内只有$B$,不满足MinPts=2,不是核心点

  • $D$$E$互为邻域,但各自邻域内只有对方,不是核心点

  • $F$无邻域点,不是核心点


Step 3:扩展簇

  • $B$为核心点,$A$$C$密度可达于$B$,形成一个簇${A,B,C}$

  • $D$$E$互为邻域,但都不是核心点,各自单独为噪声或小簇。

  • $F$为孤立点,噪声。


Step 4:最终聚类结果

  • 簇1:${A, B, C}$

  • $D$$E$$F$为噪声(或${D,E}$可合并为小簇,取决于MinPts设定


五、Python代码实现

注:记得要先 pip install scikit-learn Library喔~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

# 示例数据
X = np.array([[1,2],[2,2],[2,3],[8,7],[8,8],[25,80]])

# DBSCAN聚类
db = DBSCAN(eps=1.5, min_samples=2).fit(X)
labels = db.labels_

plt.figure(figsize=(8,6))
unique_labels = set(labels)

# 定义颜色映射
color_map = {0: 'red', 1: 'green', -1: 'black'}

for k in unique_labels:
    col = color_map.get(k, 'blue')  # 其他未知簇为蓝色
    class_member_mask = (labels == k)
    xy = X[class_member_mask]
    plt.scatter(xy[:, 0], xy[:, 1], c=col, s=100, label=f'Cluster {k}' if k != -1 else 'Noise')

plt.title('DBSCAN Clustering Result')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()
# 代码已完成,运行后将显示DBSCAN聚类结果的散点图

六、DBSCAN的优缺点

优点

  • 不需预先指定簇数

  • 能发现任意形状的簇

  • 能自动检测异常点(噪声)

  • 对异常值鲁棒(Robust)

缺点

  • 参数$\varepsilon$和MinPts敏感,需要小心设定

  • 高维(High-dimension)数据效果不佳

  • 不适合密度变化很大的数据集


七、总结

DBSCAN是一种强大且实用的聚类算法,特别适合发现复杂形状的簇和异常点。实际应用中,合理选择$\varepsilon$和MinPts参数非常关键。建议结合可视化和k距离图等方法辅助参数选择。希望本篇内容能帮助你深入理解DBSCAN的原理与实操。


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

如需进一步案例、代码实现或与其他聚类算法对比,欢迎留言交流!我是爱酱,我们下次再见,谢谢收看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值