1. 程式人生 > >DBSCAN詳解(密度聚類演算法開篇)

DBSCAN詳解(密度聚類演算法開篇)

DBSCAN詳解

第二十二次寫部落格,本人數學基礎不是太好,如果有幸能得到讀者指正,感激不盡,希望能借此機會向大家學習。這一篇作為密度聚類演算法族的開篇,主要是介紹其中最流行的一種演算法——DBSCAN,其他演算法在後續會陸續更新,連結附在該篇文章的結尾處。

預備知識:

這一部分主要是談一談DBSCAN中一些概念的定義:ϵ\epsilon-領域、核心物件、密度直達、密度可達以及密度相連。

ϵ\epsilon-領域(ϵ\epsilon-neighborhood)

  與資料集DD中樣本點xj\mathbf{x}_j的距離不大於ϵ\epsilon的樣本點所構成的集合Nϵ(x

j)N_{\epsilon}\left(\mathbf{x}_j\right)被稱為樣本xj\mathbf{x}_jϵ\epsilon-領域,即Nϵ(xj)={xjDdist(xi,xj)ϵ}N_{\epsilon}\left(\mathbf{x}_j\right)=\{\mathbf{x}_{j}\in{D}|dist\left(\mathbf{x}_i,\mathbf{x}_j\right)\leq\epsilon\}

核心物件(core object)

  如果樣本點xj\mathbf{x}_j

ϵ\epsilon-領域內所含的樣本點數大於MinPtsMinPts,那麼xj\mathbf{x}_j就被稱為核心物件,即Nϵ(xj)MinPts|N_{\epsilon}\left(\mathbf{x}_j\right)|\geq{MinPts}

密度直達(directly density-reachable)

  如果樣本點xi\mathbf{x}_i位於核心物件xj\mathbf{x}_jϵ\epsilon-領域中,那麼稱樣本點xi\mathbf{x}_ixj\mathbf{x}_j密度直達,即x

iNϵ(xj)\mathbf{x}_{i}\in{N_{\epsilon}\left(\mathbf{x}_j\right)}Nϵ(xj)MinPts|N_{\epsilon}\left(\mathbf{x}_j\right)|\geq{MinPts}。注:密度直達一般不滿足對稱性,即xi\mathbf{x}_ixj\mathbf{x}_j密度直達,但反之不一定成立。

密度可達(density-reachable)

  存在樣本點序列P1,P2,...,PnP_1,P_2,...,P_n,其中P1=xjP_1=\mathbf{x}_jPn=xiP_n=\mathbf{x}_i,且Pi+1P_{i+1}PiP_{i}密度直達,那麼稱樣本點xi\mathbf{x}_ixj\mathbf{x}_j密度可達。注:密度可達同樣不滿足對稱性,但是滿足直遞性,即若存在PiP_iPjP_j密度可達,PjP_jPkP_k密度可達,那麼可以推出PiP_iPkP_k密度可達。

密度相連(density-connected)

  假設存在樣本點xk\mathbf{x}_k,使得xi\mathbf{x}_ixj\mathbf{x}_j均由xk\mathbf{x}_k密度直達,那麼就稱xi\mathbf{x}_ixj\mathbf{x}_j密度相連。注:密度相連滿足對稱性。

推導過程

首先介紹被DBSCAN劃分出來的三類點(核心點、邊界點和噪聲點)、DBSCAN中簇是如何定義的,然後給出該演算法的虛擬碼,並對如何選擇演算法中影響聚類效果的“鄰域引數”進行介紹,最後介紹該演算法的優缺點。

核心點(core point)、邊界點(border point)和噪聲點(noise point)

  DBSCAN是密度聚類中的代表性演算法,他主要通過樣本密度來考察樣本間的可連線性,其中簇的形成主要基於樣本間距離的定義以及“鄰域引數”(ϵ,MinPts)\left(\epsilon,MinPts\right)。根據以上條件,在DBSCAN中定義了這幾個概念:ϵ\epsilon-領域、核心物件、密度直達、密度可達和密度相連,並由此引出了三種點的定義,
  a)核心點:核心點即核心物件;
  b)邊界點:位於核心物件的ϵ\epsilon-領域上和領域中的點;
  c)噪聲點:既不是核心點又不是邊界點的樣本。

DBSCAN中的簇

  DBSCAN中簇的定義為,樣本集中由密度可達關係匯出的最大的密度相連樣本集合,這種型別的簇滿足以下兩條屬性:
  a)連線性:簇中任意兩點均密度可達;
  b)最大性:所有密度可達的點必定位於同一個簇中。

DBSCAN的虛擬碼

  DBSCAN聚類的大體思路是,先將樣本集中的核心點集提取出來,再隨機選擇一個核心點作為“種子”,通過密度可達性逐步向外發散,進而找到最大的密度相連區域,具體步驟如下所示

演算法第1-7行:初始化核心物件集合Ω\Omega,遍歷整個資料集DD,找出核心物件並加入到該集合中;
演算法第8-9行:初始化簇數目kk,並將未訪問樣本集合Γ\Gamma初始化為原始資料集DD
演算法第10行:只要核心物件集合Ω\Omega中還有核心點存在,就要繼續進行迭代;
演算法第11行:將本次迭代中未訪問的樣本集合Γ\Gamma拷貝到Γold\Gamma_{old}中;
演算法第12行:從Ω\Omega隨機提取出一個核心點作為本次迭代的種子,並將其加入到佇列QQ中;
演算法第13行:將取到的核心點從未訪問樣本集合Γ\Gamma中剔除;
演算法第14-21行:只要佇列QQ不為空集,那麼每次從其中提取出首個元素,如果該元素為核心物件,那麼就將同時存在在該核心物件ϵ\epsilon-領域中的所有點和未訪問樣本集合Γ\Gamma中的樣本點記錄到佇列QQ中,並且從Γ\Gamma中剔除這些點;
演算法第22-23行:找到簇中所有的樣本點後,簇數目增一,然後將那些出現在未訪問的樣本集合原始拷貝Γold\Gamma_{old}中,且未出現在當前未訪問樣本集合Γ\Gamma的點集合作為本次迭代生成的簇CkC_k,最後從核心物件集合Ω\Omega中剔除CkC_k中出現的核心點;
演算法第24行:當不滿足第10行的迭代條件時,退出迴圈。

如何選擇DBSCAN的引數

  從上述討論可知,“鄰域引數”(ϵ,MinPts)\left(\epsilon,MinPts\right)是影響該演算法聚類質量的兩個重要的因素。根據該演算法的虛擬碼,那些沒有被分配到任何簇中的樣本點被作為噪聲來處理,當ϵ\epsilon設定的比較大而MinPtsMinPts設定的較小時,某些噪聲點甚至會被選為核心點,而當ϵ\epsilon設定的比較小而MinPtsMinPts設定的較大時,該演算法甚至不會生成有效簇。舉例來說,下圖中存在4個被噪聲點包圍的簇,點的密度越大,影象越深。

  如果ϵ\epsilon設定的足夠高,那麼DBSCAN就會發現簇C和D,但是這時圖中左側的簇A、B及其周圍的噪聲點將被作為一個簇來處理,如果ϵ\epsilon設定的足夠低,那麼DBSCAN就會發現簇A和B,但是會將圖中右側的所有樣本點做為早噪聲來處理,因此如何選擇鄰域引數非常重要。一種基本的方法是基於kk-距離的思想,選取某個kk值,並計算資料集中所有樣本點距離其第kk(一般取4)個最近鄰的距離,然後將這些距離進行排序,會得到類似於下圖中的特性曲線

可以明顯的看出圖中某點處的kk-距離急劇上升,那麼這個點所對應的kk-距離可以作為ϵ\epsilon的值,此時的kk就是MinPtsMinPts

DBSCAN的優缺點

  DBSCAN的時間複雜度是O(m2)O\left(m^2\right)