DBSCAN密度聚類算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具備噪聲的基於密度的聚類方法)是一種很典型的密度聚類算法,和K-Means,BIRCH這些通常只適用於凸樣本集的聚類相比,DBSCAN既能夠適用於凸樣本集,也能夠適用於非凸樣本集。下面咱們就對DBSCAN算法的原理作一個總結。html

1、密度聚類原理

    DBSCAN是一種基於密度的聚類算法,這類密度聚類算法通常假定類別能夠經過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本週圍不遠處必定有同類別的樣本存在。算法

    經過將緊密相連的樣本劃爲一類,這樣就獲得了一個聚類類別。經過將全部各組緊密相連的樣本劃爲各個不一樣的類別,則咱們就獲得了最終的全部聚類類別結果。數組

2、DBSCAN密度定義

    在上一節咱們定性描述了密度聚類的基本思想,本節咱們就看看DBSCAN是如何描述密度聚類的。DBSCAN是基於一組鄰域來描述樣本集的緊密程度的,參數(\(\epsilon\), MinPts)用來描述鄰域的樣本分佈緊密程度。其中,\(\epsilon\)描述了某同樣本的鄰域距離閾值,MinPts描述了某同樣本的距離爲\(\epsilon\)的鄰域中樣本個數的閾值。微信

    假設個人樣本集是D=\((x_1,x_2,...,x_m)\),則DBSCAN具體的密度描述定義以下:post

    1) \(\epsilon\)-鄰域:對於\(x_j \in D\),其\(\epsilon\)-鄰域包含樣本集D中與\(x_j\)的距離不大於\(\epsilon\)的子樣本集,即\(N_{\epsilon}(x_j) = \{x_i \in D | distance(x_i,x_j) \leq \epsilon\}\), 這個子樣本集的個數記爲\(|N_{\epsilon}(x_j)|\) spa

    2) 核心對象:對於任同樣本\(x_j \in D\),若是其\(\epsilon\)-鄰域對應的\(N_{\epsilon}(x_j)\)至少包含MinPts個樣本,即若是\(|N_{\epsilon}(x_j)| \geq MinPts\),則\(x_j\)是核心對象。 3d

    3)密度直達:若是\(x_i\)位於\(x_j\)\(\epsilon\)-鄰域中,且\(x_j\)是核心對象,則稱\(x_i\)\(x_j\)密度直達。注意反之不必定成立,即此時不能說\(x_j\)\(x_i\)密度直達, 除非且\(x_i\)也是核心對象。htm

    4)密度可達:對於\(x_i\)\(x_j\),若是存在樣本樣本序列\(p_1, p_2,...,p_T\),知足\(p_1 = x_i, p_T = x_j\), 且\(p_{t+1}\)\(p_{t}\)密度直達,則稱\(x_j\)\(x_i\)密度可達。也就是說,密度可達知足傳遞性。此時序列中的傳遞樣本\(p_1, p_2,...,p_{T-1}\)均爲核心對象,由於只有核心對象才能使其餘樣本密度直達。注意密度可達也不知足對稱性,這個能夠由密度直達的不對稱性得出。對象

    5)密度相連:對於\(x_i\)\(x_j\),若是存在覈心對象樣本\(x_k\),使\(x_i\)\(x_j\)均由\(x_k\)密度可達,則稱\(x_i\)\(x_j\)密度相連。注意密度相連關係是知足對稱性的。blog

    從下圖能夠很容易看出理解上述定義,圖中MinPts=5,紅色的點都是核心對象,由於其\(\epsilon\)-鄰域至少有5個樣本。黑色的樣本是非核心對象。全部核心對象密度直達的樣本在以紅色核心對象爲中心的超球體內,若是不在超球體內,則不能密度直達。圖中用綠色箭頭連起來的核心對象組成了密度可達的樣本序列。在這些密度可達的樣本序列的\(\epsilon\)-鄰域內全部的樣本相互都是密度相連的。

    有了上述定義,DBSCAN的聚類定義就簡單了。

3、DBSCAN密度聚類思想

    DBSCAN的聚類定義很簡單:由密度可達關係導出的最大密度相連的樣本集合,即爲咱們最終聚類的一個類別,或者說一個簇。

    這個DBSCAN的簇裏面能夠有一個或者多個核心對象。若是隻有一個核心對象,則簇裏其餘的非核心對象樣本都在這個核心對象的\(\epsilon\)-鄰域裏;若是有多個核心對象,則簇裏的任意一個核心對象的\(\epsilon\)-鄰域中必定有一個其餘的核心對象,不然這兩個核心對象沒法密度可達。這些核心對象的\(\epsilon\)-鄰域裏全部的樣本的集合組成的一個DBSCAN聚類簇。

    那麼怎麼才能找到這樣的簇樣本集合呢?DBSCAN使用的方法很簡單,它任意選擇一個沒有類別的核心對象做爲種子,而後找到全部這個核心對象可以密度可達的樣本集合,即爲一個聚類簇。接着繼續選擇另外一個沒有類別的核心對象去尋找密度可達的樣本集合,這樣就獲得另外一個聚類簇。一直運行到全部核心對象都有類別爲止。

    基本上這就是DBSCAN算法的主要內容了,是否是很簡單?可是咱們仍是有三個問題沒有考慮。

    第一個是一些異常樣本點或者說少許遊離於簇外的樣本點,這些點不在任何一個核心對象在周圍,在DBSCAN中,咱們通常將這些樣本點標記爲噪音點。

    第二個是距離的度量問題,即如何計算某樣本和核心對象樣本的距離。在DBSCAN中,通常採用最近鄰思想,採用某一種距離度量來衡量樣本距離,好比歐式距離。這和KNN分類算法的最近鄰思想徹底相同。對應少許的樣本,尋找最近鄰能夠直接去計算全部樣本的距離,若是樣本量較大,則通常採用KD樹或者球樹來快速的搜索最近鄰。若是你們對於最近鄰的思想,距離度量,KD樹和球樹不熟悉,建議參考以前寫的另外一篇文章K近鄰法(KNN)原理小結

    第三種問題比較特殊,某些樣本可能到兩個核心對象的距離都小於\(\epsilon\),可是這兩個核心對象因爲不是密度直達,又不屬於同一個聚類簇,那麼若是界定這個樣本的類別呢?通常來講,此時DBSCAN採用先來後到,先進行聚類的類別簇會標記這個樣本爲它的類別。也就是說DBSCAN的算法不是徹底穩定的算法。

4、DBSCAN聚類算法

    下面咱們對DBSCAN聚類算法的流程作一個總結。

    輸入:樣本集D=\((x_1,x_2,...,x_m)\),鄰域參數\((\epsilon, MinPts)\), 樣本距離度量方式

    輸出: 簇劃分C. 

    1)初始化核心對象集合\(\Omega = \emptyset\), 初始化聚類簇數k=0,初始化未訪問樣本集合\(\Gamma\) = D,  簇劃分C = \(\emptyset\)

    2) 對於j=1,2,...m, 按下面的步驟找出全部的核心對象:

      a) 經過距離度量方式,找到樣本\(x_j\)\(\epsilon\)-鄰域子樣本集\(N_{\epsilon}(x_j)\)

      b) 若是子樣本集樣本個數知足\(|N_{\epsilon}(x_j)| \geq MinPts\), 將樣本\(x_j\)加入核心對象樣本集合:\(\Omega = \Omega \cup \{x_j\}\)

    3)若是核心對象集合\(\Omega = \emptyset\),則算法結束,不然轉入步驟4.

    4)在覈心對象集合\(\Omega\)中,隨機選擇一個核心對象\(o\),初始化當前簇核心對象隊列\(\Omega_{cur} = \{o\}\), 初始化類別序號k=k+1,初始化當前簇樣本集合\(C_k =  \{o\}\), 更新未訪問樣本集合\(\Gamma = \Gamma -  \{o\}\)

    5)若是當前簇核心對象隊列\(\Omega_{cur} = \emptyset\),則當前聚類簇\(C_k\)生成完畢, 更新簇劃分C=\(\{C_1,C_2,...,C_k\}\), 更新核心對象集合\(\Omega = \Omega - {C_k}\), 轉入步驟3。

    6)在當前簇核心對象隊列\(\Omega_{cur}\)中取出一個核心對象\(o^{'}\),經過鄰域距離閾值\(\epsilon\)找出全部的\(\epsilon\)-鄰域子樣本集\(N_{\epsilon}(o^{'})\),令$\Delta = N_{\epsilon}(o^{'}) \cap \Gamma \(, 更新當前簇樣本集合\)C_k =C_k \cup \Delta\(, 更新未訪問樣本集合\)\Gamma = \Gamma - \Delta\(,  更新\)\Omega_{cur} = \Omega_{cur} \cup (\Delta \cap \Omega) - {o'}$,轉入步驟5.

    輸出結果爲: 簇劃分C=\(\{C_1,C_2,...,C_k\}\)

5、DBSCAN小結

    和傳統的K-Means算法相比,DBSCAN最大的不一樣就是不須要輸入類別數k,固然它最大的優點是能夠發現任意形狀的聚類簇,而不是像K-Means,通常僅僅使用於凸的樣本集聚類。同時它在聚類的同時還能夠找出異常點,這點和BIRCH算法相似。

    那麼咱們何時須要用DBSCAN來聚類呢?通常來講,若是數據集是稠密的,而且數據集不是凸的,那麼用DBSCAN會比K-Means聚類效果好不少。若是數據集不是稠密的,則不推薦用DBSCAN來聚類。

    下面對DBSCAN算法的優缺點作一個總結。

    DBSCAN的主要優勢有:

    1) 能夠對任意形狀的稠密數據集進行聚類,相對的,K-Means之類的聚類算法通常只適用於凸數據集。

    2) 能夠在聚類的同時發現異常點,對數據集中的異常點不敏感。

    3) 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。

    DBSCAN的主要缺點有:

    1)若是樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類通常不適合。

    2) 若是樣本集較大時,聚類收斂時間較長,此時能夠對搜索最近鄰時創建的KD樹或者球樹進行規模限制來改進。

    3) 調參相對於傳統的K-Means之類的聚類算法稍複雜,主要須要對距離閾值\(\epsilon\),鄰域樣本數閾值MinPts聯合調參,不一樣的參數組合對最後的聚類效果有較大影響。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)

相關文章
相關標籤/搜索