【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的原理与实操。


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

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

### 回答1: DBSCAN是一种密度聚类算法,可以通过Python代码实现。以下是一个使用Python实现DBSCAN算法的示例代码: ```python from sklearn.cluster import DBSCAN from sklearn import datasets import matplotlib.pyplot as plt # 导入数据集 iris = datasets.load_iris() X = iris.data # 构建DBSCAN聚类模型 dbscan = DBSCAN(eps=0.4, min_samples=5) dbscan.fit(X) # 打印聚类标签 print("聚类标签: ", dbscan.labels_) # 绘制聚类结果 colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k'] for i in range(len(X)): plt.scatter(X[i][0], X[i][1], c=colors[dbscan.labels_[i]]) plt.show() ``` 在这个示例中,我们使用Scikit-learn库中的DBSCAN模块进行聚类。首先,我们从Scikit-learn库中导入DBSCAN和数据集。然后,我们设置聚类模型的超参数,包括eps和min_samples。接下来,我们使用模型拟合数据,并打印每个点的聚类标签。后,我们使用Matplotlib库绘制数据点和聚类结果。 ### 回答2: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它能够发现任意形状的聚类簇,并且可以自动识别出噪声点。 以下是一个DBSCAN聚类算法Python代码示例: ```python import numpy as np from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 生成用于聚类的样本数据(示例数据) X, _ = make_moons(n_samples=200, noise=0.05, random_state=0) # 初始化DBSCAN聚类dbscan = DBSCAN(eps=0.3, min_samples=5) # 执行聚类 labels = dbscan.fit_predict(X) # 绘制聚类结果 unique_labels = set(labels) colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))] for k, col in zip(unique_labels, colors): if k == -1: # 噪声点(标签为-1)用黑色表示 col = [0, 0, 0, 1] class_member_mask = (labels == k) xy = X[class_member_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), markeredgecolor='k', markersize=6) plt.title('DBSCAN Clustering') plt.show() ``` 上述代码首先使用 `make_moons` 函数生成了一个样本数据集(只包含特征数据)。然后,使用 `DBSCAN` 类初始化了一个DBSCAN聚类器,将 `eps` 参数设置为0.3(表示两个样本之间的大距离)和 `min_samples` 参数设置为5(表示核心样本的小数量)。接下来,使用 `fit_predict` 方法执行聚类,返回每个样本的所属聚类簇标签(包括噪声点,标签为-1)。后,根据聚类结果使用不同颜色绘制样本数据的散点图。 这段代码的作用是通过DBSCAN算法对于样本数据进行聚类,并使用散点图可视化聚类结果。 ### 回答3: DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种经典的聚类算法,用于对具有高密度区域和低密度区域的数据进行聚类。下面是一个用Python实现DBSCAN聚类算法的示例代码: ```python import numpy as np from sklearn.cluster import DBSCAN # 创建样本数据 X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0], [7, 2], [7, 4], [7, 0]]) # 创建DBSCAN聚类模型 dbscan = DBSCAN(eps=2, min_samples=2) # 进行聚类 labels = dbscan.fit_predict(X) # 打印每个样本的聚类结果 for i in range(len(X)): print("样本", X[i], "聚类结果:", labels[i]) ``` 在这个示例中,我们首先创建了一个样本数据矩阵X,其中每行表示一个样本。接下来,我们使用`DBSCAN()`函数创建了一个DBSCAN聚类模型。`eps`参数用于指定邻域的半径大小,`min_samples`参数用于指定一个核心点所需的小邻域样本数。然后,我们调用模型的`fit_predict()`方法对样本进行聚类,并将聚类结果存储在`labels`变量中。后,我们遍历每个样本,并打印其聚类结果。 需要注意的是,以上代码中使用的是`sklearn`库中的`DBSCAN`类来实现DBSCAN算法。该类提供了丰富的参数和方法,可以根据需要进行调整和使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值