
【scikit-learn】sklearn.cluster.DBSCAN 类:基于密度的聚类
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是 sklearn.cluster 提供的基于密度的聚类方法,适用于任意形状的簇,并能识别噪声点,在处理高噪声数据、聚类数未知、数据簇形状不规则 时表现优越。DBSCAN 适用于非规则形状的簇,能够检测噪声点,适用于高噪声数据,不需要手动指定簇数 K。适用于异常检测
·
sklearn.cluster.DBSCAN
(基于密度的聚类)
DBSCAN
(Density-Based Spatial Clustering of Applications with Noise)是 sklearn.cluster
提供的 基于密度的聚类方法,适用于 任意形状的簇,并能识别噪声点,在处理 高噪声数据、聚类数未知、数据簇形状不规则 时表现优越。
1. DBSCAN
作用
- 适用于非球形簇(如长条形、环状),不像
KMeans
需要预设K
值。 - 基于密度的聚类,通过 邻域半径 (
eps
) 和最小点数 (min_samples
) 确定簇。 - 能够识别噪声点(
label=-1
),不像KMeans
需要所有点归入某个簇。
2. DBSCAN
代码示例
(1) 训练 DBSCAN
聚类模型
from sklearn.cluster import DBSCAN
import numpy as np
# 生成数据
X = np.random.rand(100, 2) # 100 个二维点
# 训练 DBSCAN 聚类模型
model = DBSCAN(eps=0.2, min_samples=5)
labels = model.fit_predict(X)
print("DBSCAN 簇标签:", labels[:10])
解释
eps=0.2
:定义密度阈值(两点距离 ≤0.2
视为邻居)。min_samples=5
:一个簇最少包含5
个样本。fit_predict(X)
:训练DBSCAN
并返回簇标签(-1
代表噪声点)。
3. DBSCAN
主要参数
DBSCAN(eps=0.5, min_samples=5, metric="euclidean")
参数 | 说明 |
---|---|
eps | 邻域半径(默认 0.5 ,值越大,簇越大) |
min_samples | 最小簇样本数(默认 5 ) |
metric | 距离度量(默认 "euclidean" ,可选 "manhattan" 、"cosine" ) |
4. 选择合适的 eps
和 min_samples
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
# 计算 k 近邻距离
neighbors = NearestNeighbors(n_neighbors=5)
neighbors.fit(X)
distances, _ = neighbors.kneighbors(X)
# 取第 5 近邻距离并排序
distances = np.sort(distances[:, 4])
plt.plot(distances)
plt.xlabel("数据点索引")
plt.ylabel("第 5 近邻距离")
plt.title("选择最佳 eps")
plt.show()
解释
- 观察 “膝点”(Elbow Point) 选择
eps
,避免eps
过大或过小。
5. DBSCAN
可视化
import seaborn as sns
sns.scatterplot(x=X[:, 0], y=X[:, 1], hue=labels, palette="coolwarm")
plt.title("DBSCAN 聚类结果")
plt.show()
解释
- 不同颜色代表不同簇,
-1
为噪声点。
6. 计算聚类性能
from sklearn.metrics import silhouette_score
# 过滤掉噪声点(避免 silhouette_score 错误)
X_filtered = X[labels != -1]
labels_filtered = labels[labels != -1]
if len(set(labels_filtered)) > 1: # 至少有 2 个簇才计算 silhouette_score
score = silhouette_score(X_filtered, labels_filtered)
print("轮廓系数:", score)
解释
silhouette_score(X, labels)
评估聚类效果(值越大越好)。- 去除
-1
(噪声点)再计算,否则silhouette_score
会报错。
7. DBSCAN
vs. KMeans
vs. AgglomerativeClustering
方法 | 适用情况 | 主要区别 |
---|---|---|
DBSCAN | 适用于非规则簇,检测噪声点 | 不需预设簇数,依赖 eps 和 min_samples |
KMeans | 数据均匀分布,适用于大规模数据 | 需要预设簇数 K ,易受初始点影响 |
AgglomerativeClustering | 适用于层级结构的数据 | 适用于小规模数据,可视化树形结构 |
8. 适用场景
- 异常检测(
DBSCAN
可将孤立点归为-1
)。 - 图像分割(适用于 非规则形状)。
- 市场分析(可识别 不同购买模式)。
9. 结论
DBSCAN
适用于非规则形状的簇,能够检测噪声点,适用于高噪声数据,不需要手动指定簇数K
。适用于 异常检测、市场分析、图像分割。
更多推荐
所有评论(0)