相關概念
是一種密度聚類算法,它基於一組"鄰域" (neighborhood) 參數來刻畫樣本分佈的緊密程度.。可在噪聲的空間數據庫中發現任意形狀的聚類。
給定數據集D={,},定義下面幾個概念:
如下圖:
故DBSCAN 將"簇"定義爲:由密度可達關係導出的最大的 密度相連樣本集合。
那麼如何找這個“簇”呢?
====》即是由 x 密度可達的所有樣本組成的集合。
算法思想
DBSCAN 算法先任選數據集中的一個核心對象爲"種子" (seed),再由此出發確定相應的聚類簇。如下描述:
(1)Repeat
(2)從數據庫中抽出一個未處理的點;
(3)IF抽出的點是核心點 THEN 找出所有從該點密度可達的對象,形成一個簇;
(4)ELSE 抽出的點是邊緣點(非核心對象),跳出本次循環,尋找下一個點;
(5)UNTIL 所有的點都被處理。
詳細過程如下:
聚類生成過程如下圖:
優缺點
缺點:
- DBSCAN對用戶定義的參數很敏感,細微的不同都可能導致差別很大的結果,而參數(如鄰域半徑,核心對象鄰域內最小樣本數等)的選擇無規律可循,只能靠經驗確定。
優點:
- 對於非凸數據集的聚類表現好
實現
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#準備數據
X1, y1=datasets.make_circles(n_samples=5000, factor=.6, noise=.05)
X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]], random_state=9)
X = np.concatenate((X1, X2))
#開始聚類
y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
DBSCAN函數:eps是鄰域半徑,min_samples是該鄰域內應有的最小樣本數。其餘參數時默認值就好。
但是如果鄰域半徑和核心對象鄰域內最小樣本數等參數選取不好的話,則聚類效果會不一樣,比如出現下面這種情況:
對於非凸數據集的聚類表現好,同樣的數據如果採用k-means的話則是:
參考
- https://blog.csdn.net/u010670689/article/details/74936338(對比了DBSCAN和K-mean算法在處理特殊分佈數據上的差異)