以下是 DBSCAN 算法在 Python 中的几个典型应用示例,涵盖了基础使用、参数调优和可视化等方面:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons, make_blobs
from sklearn.preprocessing import StandardScaler
# 1. 生成测试数据 - 月牙形数据(展示DBSCAN处理非凸形状的优势)
X_moons, y_moons = make_moons(n_samples=500, noise=0.05, random_state=42)
X_moons = StandardScaler().fit_transform(X_moons)
# 2. 应用DBSCAN聚类
dbscan = DBSCAN(eps=0.3, min_samples=5) # 设置核心参数
labels_moons = dbscan.fit_predict(X_moons)
# 3. 可视化结果
plt.figure(figsize=(10, 6))
# 绘制聚类结果,噪声点用黑色表示
unique_labels = set(labels_moons)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for label, color in zip(unique_labels, colors):
if label == -1: # -1表示噪声点
color = [0, 0, 0, 1] # 黑色
class_member_mask = (labels_moons == label)
xy = X_moons[class_member_mask]
plt.scatter(xy[:, 0], xy[:, 1], c=[color], s=50, alpha=0.8)
plt.title('DBSCAN Clustering on Moon-shaped Data')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
# 4. 生成并处理另一种数据 - 带异常值的 blob 数据
X_blobs, y_blobs = make_blobs(n_samples=300, centers=3, cluster_std=0.6, random_state=0)
# 添加异常值
X_blobs = np.vstack([X_blobs, np.random.uniform(low=-10, high=10, size=(20, 2))])
X_blobs = StandardScaler().fit_transform(X_blobs)
# 应用DBSCAN
dbscan_blobs = DBSCAN(eps=0.5, min_samples=5)
labels_blobs = dbscan_blobs.fit_predict(X_blobs)
# 可视化blob数据聚类结果
plt.figure(figsize=(10, 6))
unique_labels_blobs = set(labels_blobs)
colors_blobs = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels_blobs))]
for label, color in zip(unique_labels_blobs, colors_blobs):
if label == -1:
color = [0, 0, 0, 1] # 噪声点黑色
class_member_mask = (labels_blobs == label)
xy = X_blobs[class_member_mask]
plt.scatter(xy[:, 0], xy[:, 1], c=[color], s=50, alpha=0.8)
plt.title('DBSCAN Clustering on Blob Data with Outliers')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
这些代码示例展示了 DBSCAN 算法在不同场景下的应用:
基础应用示例:展示了 DBSCAN 处理非凸形状数据(月牙形)和带异常值数据的能力。通过可视化可以清晰看到,相比 K-Means,DBSCAN 能更好地识别自然聚类形状并标记异常点。
参数调优示例:实现了 K - 距离法来帮助确定最佳的 ε 参数。在实际应用中,我们通常观察 K - 距离曲线的 "拐点" 来选择合适的 ε 值,这个点代表了数据密度的突变处。
真实世界应用示例:模拟了客户分群场景,使用消费频率、平均消费金额和最近消费时间间隔三个特征进行聚类。通过 PCA 降维可视化聚类结果,并对每个聚类的特征进行统计分析,帮助理解不同客户群体的行为模式。
使用这些代码时,需要注意:
DBSCAN 对数据缩放敏感,通常需要先进行标准化处理
参数 ε 和 min_samples 需要根据具体数据集调整
对于高维数据,建议先进行降维处理(如 PCA)
大规模数据集可能需要调整算法参数(如使用 ball_tree 或 kd_tree)来提高效率