📅  最后修改于: 2023-12-03 15:40:19.851000             🧑  作者: Mango
机器学习中的 DBSCAN 聚类 | 基于密度的聚类
DBSCAN (Density-based spatial clustering of applications with noise) 聚类是一种基于密度的聚类算法。它将数据点打上三种标签:核心点(core points)、边界点(border points)和噪点(noise points),并将相邻的核心点归为一簇。DBSCAN 算法克服了传统聚类算法常见的圆形簇堆叠问题,非常适用于非球形、非凸集等复杂形状的数据聚类分析。
算法原理
DBSCAN 算法基于密度来确定簇的形状和数量,其核心思想是:若一个点的密度达到某一阈值,则将其归为簇中;否则,该点视为噪声点。
- 核心点:在以该点为圆心、以半径 $Eps$ 为半径的圆内拥有不少于 $MinPts$ 个点的点为核心点。
- 边界点:在以该点为圆心、以半径 $Eps$ 为半径的圆内拥有少于 $MinPts$ 个点的点为边界点。
- 噪声点:即不是核心点,也不是边界点的点。
算法流程
- 随机选取一个未访问过的数据点 $p$ 作为起点;
- 根据 $p$ 的 $\varepsilon$ 邻域内点的个数将 $p$ 分为核心点、边界点和噪声点;
- 将 $p$ 划入一个新的簇并标记为已访问;
-
在 $p$ 的 $\varepsilon$ 邻域内寻找相邻点 $q$:
- 如果 $q$ 为未访问,则以 $q$ 为起点,重复步骤 2-4。如果 $q$ 是边界点,则将 $q$ 加入当前簇中。
- 当所有的相邻点都已访问完时,一个新的簇就被找到了。
算法优缺点
优点:
- 能识别出各种形状的簇,并能准确识别出离群点;
- 不需要预先指定簇的个数;
- 适用于处理大型数据集。
缺点:
- 对于高维数据,由于“维度灾难”的影响,其聚类效果可能会受到影响;
- 得益于基于密度的聚类原则,需要事先设定半径和样本密度等参数,需要对数据集的特征有一定的了解。
Python实现
from sklearn import datasets
from sklearn.cluster import DBSCAN
# 载入数据集
iris = datasets.load_iris()
X = iris.data
# DBSCAN 聚类
dbscan = DBSCAN(eps=0.4, min_samples=5) # 修改 eps 和 min_samples 可调整聚类效果
dbscan.fit(X)
labels = dbscan.labels_
# 输出聚类结果
print(labels)
参考资料
- Ester, M., Kriegel, H. P., Sander, J., & Xu, X. (1996). A density-based algorithm for discovering clusters in large spatial databases with noise. Kdd, 96(34), 226-231.
- Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., & Duchesnay, E. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12(Oct), 2825-2830.