DBSCAN


DBSCAN,Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類算法

 

VS KMeans

Kmeans 是最常用的聚類算法之一,但它只適用於 凸樣本集,而 DBSCAN 適用於 凸樣本集和非凸樣本集,更多的用於 非凸樣本集;

記住這一點即可:Kmeans 只能生成球形簇,DBSCAN 可以生成任意形狀的簇

 

算法原理

DBSCAN 是一種基於密度的聚類算法,其核心是根據樣本分布的緊密程度來划分類別

形象描述

DBSCAN 的原理類似傳銷,傳銷組織會分成一個個窩點(類別),就是一撥人租個房;

起初窩點里只有一個人(隨機找一個點);

然后這個人(核心對象)有很多親戚朋友(關系近),他就通過騙取親戚朋友發展下線(直接下線叫密度直達),騙來的人也住進了窩點;

然后每個下線(新的核心對象)也有很多親戚朋友,也通過同樣的方式發展自己的下線,然后下線的下線也住進了窩點;

上上線 和 新來的下線(間接下線) 通過 上線 住進了一個窩點(密度可達),也就成了一類;

然后循環往復,直到某個人周圍沒有親戚朋友(邊界點),完了,生意做不下去了;

但最終這個窩點的人都認識了(密度相連);

 

另起一個窩點吧(新的類別),

重復上面的過程,最終形成一個個窩點;

 

可能有些窩點很特別,當這個窩點只有一個人時,這個人周圍就已經沒有親戚朋友了,這個窩點就沒用了(孤立點,異常值)

 

數學描述

DBSCAN 通過不斷尋找核心對象來確定樣本類別,其中有兩個重要參數 (ε,MinPts);

假設我的樣本集是D=(x1,x2,...,xm), 則DBSCAN具體的描述定義如下:

1)ϵ-鄰域:對於xj€D,其ϵ-鄰域包含樣本集D中與xj的距離不大於ϵ的子樣本集,【在 xj 周圍畫個 以 ε 為半徑的圓】

2 ) 核心對象:對於任一樣本xj€D,如果其ϵ-鄰域內至少包含MinPts個樣本,則稱其是核心對象。 【在 xj 周圍畫個半徑為 ε 的圓,圓內的樣本數大於等於 MinPts 】

3)密度直達:如果xi位於xj的ϵ-鄰域中,且xj是核心對象,則稱xi由xj密度直達。【圓心 和 圓內的點 叫密度直達】

注意反之不一定成立,即此時不能說xj由xi密度直達, 除非且xi也是核心對象。

4)密度可達:對於xi和xj,如果存在樣本序列p1,p2,...,pT,滿足p1=xi,pT=xj, 且pt+1由pt密度直達,則稱x由xi密度可達。

也就是說,密度可達滿足傳遞性。此時序列中的傳遞樣本p1,p2,...,pT−1均為核心對象,因為只有核心對象才能使其他樣本密度直達。

注意密度可達也不滿足對稱性,這個可以由密度直達的不對稱性得出。

5)密度相連:對於xi和xj,如果存在核心對象樣本xk,使xi和xj均由xk密度可達,則稱xi和xj密度相連。注意密度相連關系是滿足對稱性的。

 

從下圖可以很容易理解上述定義,圖中MinPts=5,紅色的點都是核心對象,因為其ϵ-鄰域至少有5個樣本。黑色的樣本是非核心對象。

所有核心對象密度直達的樣本在以紅色核心對象為中心的超球體內,如果不在超球體內,則不能密度直達。

圖中用綠色箭頭連起來的核心對象組成了密度可達的樣本序列。在這些密度可達的樣本序列的ϵ-鄰域內所有的樣本相互都是密度相連的。

DBSCAN 還有3個點描述:

  • 核心點:即核心對象,core point
  • 邊界點:與某個核心對象密度直達,但其鄰域內少於 MinPts 個點,但他仍被歸於和核心對象一個簇,border point
  • 離群點:也叫異常值,不和任意核心對象密度直達,自己也不是核心對象,outlier point

 

算法步驟

找了個圖,思路還是比較清晰的

注意, 某些樣本可能到兩個核心對象的距離都小於ϵ,但是這兩個核心對象不是密度直達,不屬於同一個聚類簇,那么如何界定這個樣本的類別呢?

一般來說,DBSCAN采用先來后到,先進行聚類的類別簇會標記這個樣本為它的類別。也就是說DBSCAN的算法不是完全穩定的算法

 

優點

1. 無需指定 類別數 K

2. 對異常值不敏感

3. 可以形成任意形狀的簇

 

缺點

1. 對於分布緊密程度比較均勻的樣本集不太適用

2. 對於樣本集很大,維度很高的樣本集,計算量太大,效率較低  【此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。】

3. 受 (ε,MinPts) 參數影響較大

 

Sklearn 用法

核心參數

def __init__(self, eps=0.5, min_samples=5, metric='euclidean',
                 metric_params=None, algorithm='auto', leaf_size=30, p=None,
                 n_jobs=1):

metric 可指定計算距離的方式

返回值

core_sample_indices_ : 核心點的索引,因為labels_不能區分核心點還是邊界點,所以需要用這個索引確定核心點

components_:訓練樣本的核心點

labels_:每個點所屬集群的標簽,-1代表噪聲點


示例代碼
import numpy as np
from sklearn.cluster import DBSCAN

X = np.array([[1, 2], [2, 2], [2, 3], [-25, -80],
             [8, 7], [8, 8], [25, 80], [6, 8]])
clustering = DBSCAN(eps=3, min_samples=2).fit(X)
print(clustering.labels_)       # [ 0  0  0 -1  1  1 -1  1]     異常點被標記為-1

index = clustering.core_sample_indices_     # 核心對象的下標
print(index)                    # [0 1 2 4 5 7]

core_sample = X[index]      # 核心對象
print(core_sample)
# [[1 2]
#  [2 2]
#  [2 3]
#  [8 7]
#  [8 8]
#  [6 8]]

print(clustering.components_)   # 核心對象,同上
# [[1 2]
#  [2 2]
#  [2 3]
#  [8 7]
#  [8 8]
#  [6 8]]

 

 

 

參考資料:

https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html  官網

https://www.cnblogs.com/pinard/p/6208966.html  DBSCAN密度聚類算法

https://www.cnblogs.com/pinard/p/6217852.html  用scikit-learn學習DBSCAN聚類

https://zhuanlan.zhihu.com/p/185623849  詳解DBSCAN聚類

https://www.jianshu.com/p/e594c2ce0ac0  DBSCAN 算法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM