详解机器学习经典模型(原理及应用)——DBSCAN
一、概念
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它能够在具有噪声的空间数据集中发现任意形状的聚类(即带噪声的聚类模型)。DBSCAN将簇定义为密度相连的点的最大集合,通过在数据空间中找到高密度区域作为簇,同时把孤立点(密度低的点)归为噪声。此外,DBSCAN最大的优势就是它不需要指定聚类簇的数量。
二、模型原理
1、相关概念
- ε-邻域(Epsilon-neighborhood):对于某个点p,以半径ε为边界的区域内所有的点称为该点的ε-邻域。
- 核心点(Core Point):如果一个点p的ε-邻域内至少有min_samples个点(包括p自己),那么它被称为核心点。
- 边界点(Border Point):如果一个点p在某个核心点的ε-邻域内,但自身不是核心点,它被称为边界点。
- 噪声点(Noise Point):如果一个点既不是核心点,也不属于任何核心点的邻域,它被认为是噪声点。
- 密度直达(Directly Density-Reachable):如果点p是核心点,并且点q在p的ε-邻域内,那么q被称为从p密度直达。
- 密度可达(Density-Reachable):如果存在一条核心点链表(p1→p2→...→pn),使得每个点从前一个点密度直达,且p1=p,pn=q,则q是从p密度可达的。
- 密度相连(Density-Connected):如果存在一个点o,使得p和q都从o密度可达,则称p和q是密度相连的。
2、算法流程
(1)初始化
- 遍历数据集中的每个点p。
- 对于每个点p,找到其ε-邻域(由我们定义,需要多次尝试找到最优值)内的所有点。
(2)形成聚类
- 如果p是核心点,创建一个新的聚类C,并将p添加到C。
- 将p的 ε-邻域内的所有直接密度可达的点添加到C。
- 递归地,将这些点的直接密度可达的点添加到C。
(3)处理边界点和噪声
- 如果一个点不是核心点,也不是任何核心点的直接密度可达点,则将其标记为噪声。需要注意的是,噪声点的数量跟ε参数和min_samples参数的取值有关,在不同的取值范围内,点A可能是噪声,也可能是核心点。
(4)合并聚类
- 如果两个聚类密度相连,则将它们合并为一个聚类。
三、python示例
这里我们使用iris数据集,由于这个数据集的数据量很少,因此如果min_samples设置得稍微大一点,模型就会将所有的点都看作噪声。最佳参数可以通过网格搜索并结合聚类评估指标来确定。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 数据预处理:标准化特征值
X_scaled = StandardScaler().fit_transform(X)
# 创建DBSCAN模型实例
# eps 是邻域的大小,min_samples 是形成聚类所需的最小样本数
dbscan = DBSCAN(eps=0.2, min_samples=2)
# 执行聚类
clusters = dbscan.fit_predict(X_scaled)
# 可视化聚类结果
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=clusters, cmap='viridis', marker='o')
plt.title('DBSCAN Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.colorbar(label='Cluster Label')
plt.show()
# 打印聚类结果的统计信息
n_clusters_ = len(set(clusters)) - (1 if -1 in clusters else 0) # 减去噪声点
n_noise_ = list(clusters).count(-1)
print(f'Estimated number of clusters: {n_clusters_}')
print(f'Estimated number of noise points: {n_noise_}')
四、总结
DBSCAN是探索性数据分析、数据挖掘中常用的机器学习模型。由于我们在初期数据探索和挖掘阶段,无法很好地确定数据应当聚成多少类,因此K-Means等需要指定聚类簇数量的模型显得不那么有效了。通过调整DBSCAN模型的邻域半径和最小簇内样本数,并结合轮廓系数等聚类评估方法,可以有效地帮助我们自动将数据聚合成相对有意义的N个类簇,从而辅助我们进行数据探索和分析。例如,在NLP领域,尤其是热点挖掘、观点分析等业务中,DBSCAN以及它的优化版变体HDBSCAN都是建模利器。