🎯 学习目标

  • 理解DBSCAN算法的核心原理
  • 掌握核心点、边界点和噪声点的概念
  • 学会选择合适的eps和min_samples参数
  • 了解DBSCAN与K-Means的区别与适用场景
密度聚类概念图

什么是DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。 它将密度相连的点划分为一个簇,能够发现任意形状的簇,并能识别出噪声点。

🔬 核心概念

🎯

核心点

在eps邻域内包含至少min_samples个点的点

🔵

边界点

不是核心点,但在某个核心点的eps邻域内

噪声点

既不是核心点也不是边界点的点

⚙️ 关键参数

参数 说明 选择建议
eps (ε) 邻域半径,决定点的邻域范围 使用k-distance图,选择拐点处的距离
min_samples 核心点的最小邻域点数 通常设为维度数的2倍或更多
metric 距离度量方法 默认欧氏距离,可根据数据特点选择

💻 代码实现

from sklearn.cluster import DBSCAN from sklearn.datasets import make_moons import matplotlib.pyplot as plt # 生成月牙形数据 X, y = make_moons(n_samples=300, noise=0.05, random_state=42) # 创建DBSCAN模型 dbscan = DBSCAN(eps=0.2, min_samples=5) labels = dbscan.fit_predict(X) # labels中-1表示噪声点 n_clusters = len(set(labels)) - (1 if -1 in labels else 0) print(f'发现 {n_clusters} 个簇') print(f'噪声点数量: {(labels == -1).sum()}') # 可视化结果 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.title('DBSCAN聚类结果') plt.show()

⚖️ DBSCAN vs K-Means

特性 DBSCAN K-Means
簇的形状 任意形状 凸形(球形)
参数 eps, min_samples 簇数量K
噪声处理 自动识别噪声点 强制所有点属于某簇
时间复杂度 O(n log n) O(nkt)
密度敏感
💡
参数选择技巧

使用k-distance图选择eps:计算每个点到其第k个最近邻的距离,按降序排列绘图,选择曲线拐点处的距离作为eps值。

聚类分析
图:DBSCAN能够发现任意形状的簇

📝 本节小结

  • • DBSCAN是基于密度的聚类算法,能发现任意形状的簇
  • • 核心概念:核心点、边界点、噪声点
  • • 关键参数:eps(邻域半径)和min_samples(最小点数)
  • • 相比K-Means,DBSCAN能自动识别噪声点,无需预设簇数量
  • • 适用于密度均匀的数据集,对密度变化大的数据效果不佳