DBSCAN,英文全寫爲Density-based spatial clustering of applications with noise ,是在 1996 年由Martin Ester, Hans-Peter Kriegel, Jörg Sander 及 Xiaowei Xu 提出的聚類分析算法, 這個算法是以密度爲本的:給定某空間裏的一個點集合,這算法能把附近的點分紅一組(有不少相鄰點的點),並標記出位於低密度區域的局外點(最接近它的點也十分遠),DBSCAN 是其中一個最經常使用的聚類分析算法,也是其中一個科學文章中最常引用的。php
在 2014 年,這個算法在領頭數據挖掘會議 KDD 上獲頒發了 Test of Time award,該獎項是頒發給一些於理論及實際層面均得到持續性的關注的算法。html
基礎知識
考慮在某空間裏將被聚類的點集合,爲了進行 DBSCAN 聚類,全部的點被分爲核心點,(密度)可達點及局外點,詳請以下:算法
- 若是一個點 p 在距離 ε 範圍內有至少 minPts 個點(包括本身),則這個點被稱爲核心點,那些 ε 範圍內的則被稱爲由 p 直接可達的。同時定義,沒有任何點是由非核心點直接可達的。
- 若是存在一條道路 p1, ..., pn ,有 p1 = p和pn = q, 且每一個 pi+1 都是由 pi 直接可達的(道路上除了 q 之外全部點都必定是核心點),則稱 q 是由 p 可達的。
- 全部不禁任何點可達的點都被稱爲局外點。
若是 p 是核心點,則它與全部由它可達的點(包括核心點和非核心點)造成一個聚類,每一個聚類擁有最少一個核心點,非核心點也能夠是聚類的一部分,但它是在聚類的「邊緣」位置,由於它不能達至更多的點。數據庫
「可達性」(英文:Reachability )不是一個對稱關係,由於根據定義,沒有點是由非核心點可達的,但非核心點能夠是由其餘點可達的。因此爲了正式地界定 DBSCAN 找出的聚類,進一步定義兩點之間的「連結性」(英文:Connectedness) :若是存在一個點 o 使得點 p 和點 q 都是由 o 可達的,則點 p 和點 q 被稱爲(密度)連結的,而連結性是一個對稱關係。數組
定義了連結性以後,每一個聚類都符合兩個性質:app
- 一個聚類裏的每兩個點都是互相連結的;
- 若是一個點 p 是由一個在聚類裏的點 q 可達的,那麼 p 也在 q 所屬的聚類裏。
算法
DBSCAN 須要兩個參數:ε (eps) 和造成高密度區域所須要的最少點數 (minPts),它由一個任意未被訪問的點開始,而後探索這個點的 ε-鄰域,若是 ε-鄰域裏有足夠的點,則創建一個新的聚類,不然這個點被標籤爲雜音。注意這個點以後可能被髮如今其它點的 ε-鄰域裏,而該 ε-鄰域可能有足夠的點,屆時這個點會被加入該聚類中。svg
若是一個點位於一個聚類的密集區域裏,它的 ε-鄰域裏的點也屬於該聚類,當這些新的點被加進聚類後,若是它(們)也在密集區域裏,它(們)的 ε-鄰域裏的點也會被加進聚類裏。這個過程將一直重複,直至不能再加進更多的點爲止,這樣,一個密度連結的聚類被完整地找出來。而後,一個不曾被訪問的點將被探索,從而發現一個新的聚類或雜音。函數
算法能夠如下僞代碼表達,當中變數根據本來刊登時的命名:oop
DBSCAN(DB, dist, eps, minPts) { C = 0 /* Cluster counter */ for each point P in database DB { if label(P) ≠ undefined then continue /* Previously processed in inner loop */ Neighbors N = RangeQuery(DB, dist, P, eps) /* Find neighbors */ if |N| < minPts then { /* Density check */ label(P) = Noise /* Label as Noise */ continue } C = C + 1 /* next cluster label */ label(P) = C /* Label initial point */ Seed set S = N \ {P} /* Neighbors to expand */ for each point Q in S { /* Process every seed point */ if label(Q) = Noise then label(Q) = C /* Change Noise to border point */ if label(Q) ≠ undefined then continue /* Previously processed */ label(Q) = C /* Label neighbor */ Neighbors N = RangeQuery(DB, dist, Q, eps) /* Find neighbors */ if |N| ≥ minPts then { /* Density check */ S = S ∪ N /* Add new neighbors to seed set */ } } } }
where RangeQuery can be implemented using a database index for better performance, or using a slow linear scan:url
RangeQuery(DB, dist, Q, eps) { Neighbors = empty list for each point P in database DB { /* Scan all points in the database */ if dist(Q, P) ≤ eps then { /* Compute distance and check epsilon */ Neighbors = Neighbors ∪ {P} /* Add to result */ } } return Neighbors }
注意這個算法能夠如下方式簡化:其一,"has been visited" 和 "belongs to cluster C" 可被結合起來,另外 "expandCluster" 副程式沒必要被抽出來,由於它只在一個位置被調用。以上算法沒有以簡化方式呈現,以反映本來出版的版本。另外,regionQuery 是否包含 P 並不重要,它等價於改變 MinPts 的值。
複雜度
DBSCAN 對數據庫裏的每一點進行訪問,可能多於一次(例如做爲不一樣聚類的候選者),但在現實的考慮中,時間複雜度主要受regionQuery 的調用次數影響,DBSCAN 對每點都進行恰好一次呼叫,且若是使用了特別的編號結構,則總平均時間複雜度爲 O(n log n) ,最差時間複雜度則爲 O(n^2) 。可使用 O(n^2) 空間複雜度的距離矩陣以免重複計算距離,但若不使用距離矩陣,DBSCAN 的空間複雜度爲 O(n)。
優勢
- 相比 k-平均,DBSCAN 不須要預先聲明聚類數量。
- DBSCAN 能夠找出任何形狀的聚類,甚至能找出一個聚類,它包圍但不鏈接另外一個聚類,另外,因爲 MinPts 參數,single-link effect (不一樣聚類以一點或極幼的線相連而被當成一個聚類)能有效地被避免。
- DBSCAN 能分辨噪音(局外點)。
- DBSCAN 只需兩個參數,且對數據庫內的點的次序幾乎不敏感(兩個聚類之間邊緣的點有機會受次序的影響被分到不一樣的聚類,另外聚類的次序會受點的次序的影響)。
- DBSCAN 被設計成能配合可加速範圍訪問的數據庫結構,例如 R*樹。
- 若是對資料有足夠的瞭解,能夠選擇適當的參數以得到最佳的分類。
缺點
- DBSCAN 不是徹底決定性的:在兩個聚類交界邊緣的點會視乎它在數據庫的次序決定加入哪一個聚類,幸運地,這種狀況並不常見,並且對總體的聚類結果影響不大——DBSCAN 對核心點和噪音都是決定性的。DBSCAN* 是一種變化了的算法,把交界點視爲噪音,達到徹底決定性的結果。
- DBSCAN 聚類分析的質素受函數 regionQuery(P,ε) 裏所使用的度量影響,最經常使用的度量是歐幾里得距離,尤爲在高維度資料中,因爲受所謂「維數災難」影響,很難找出一個合適的 ε ,但事實上全部使用歐幾里得距離的算法都受維數災難影響。
- 若是數據庫裏的點有不一樣的密度,而該差別很大,DBSCAN 將不能提供一個好的聚類結果,由於不能選擇一個適用於全部聚類的 minPts-ε 參數組合。
- 若是沒有對資料和比例的足夠理解,將很難選擇適合的 ε 參數。
有關文章
- OPTICS algorithm: 一個DBSCAN的通常化,有效地以「最大搜尋半徑」代替 ε 參數。
- Connected component
- 並查集
注意
參考文獻
延伸閱讀
- Arlia, Domenica; Coppola, Massimo. "Experiments in Parallel Clustering with DBSCAN". Euro-Par 2001: Parallel Processing: 7th International Euro-Par Conference Manchester, UK August 28–31, 2001, Proceedings. Springer Berlin.
- Kriegel, Hans-Peter; Kröger, Peer; Sander, Jörg; Zimek, Arthur (2011). "Density-based Clustering". WIREs Data Mining and Knowledge Discovery. 1 (3): 231–240. doi:10.1002/widm.30.
轉載自維基百科