以下是 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)來提高效率