前言:
基於密度聚類的經典算法 DBSCAN(Density-Based Spatial Clustering of Application with Noise, 具有噪聲的基於密度的空間聚類應用)是一種基於高密度連接區域的密度聚類算法。
DBSCAN的基本算法流程如下:從任意對象P 開始根據閾值和參數通過廣度優先搜索提取從P 密度可達的所有對象,得到一個聚類。若P 是核心對象,則可以一次標記相應對象為當前 類並以此為基礎進行擴展。得到一個完整的聚類后,再選擇一個新的對象重復上述過程。 若P是邊界對象,則將其標記為噪聲並舍棄
缺陷:
如聚類的結果與參數關系較大,導致閾值過大容易將同一聚類分割, 或閾值過小容易將不同聚類合並
固定的閾值參數對於稀疏程度不同的數據不具適應性,導致密度小的區域同一聚類易被分割, 或密度大的區域不同聚類易被合並
DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 一個比較有代表性的基於密度的聚類算法。與層次聚類方法不同,它將簇定義為密度相 連的點的最大集合,能夠把具有足夠高密度的區域划分為簇,並可在有“噪聲”的空間數 據庫中發現任意形狀的聚類。
基於密度的聚類方法是以數據集在空間分布上的稠密度為依據進行聚類,無需預先設定 簇的數量,因此特別適合對於未知內容的數據集進行聚類。而代表性算法有:DBSCAN,OPTICS。 以DBSCAN算法舉例,DBSCAN目的是找到密度相連對象的最大集合。
1.DBSCAN算法
首先名詞解釋:
ε(Eps)鄰域:以給定對象為圓心,半徑為ε的鄰域為該對象的ε鄰域
核心對象:若ε鄰域至少包含MinPts個對象,則稱該對象為核心對象
直接密度可達:如果p在q的ε鄰域內,而q是一個核心對象,則說對象p從對象q出發是直接密度可達的
密度可達:如果存在一個對象鏈p1 , p2 , … , pn , p1=q, pn=p, 對於pi ∈D(1<= i <=n), pi+1 是從 pi 關於ε和MinPts直接密度可達的, 則對象p是從對象q關於ε和MinPts密度可達的
密度相連:對象p和q都是從o關於ε和MinPts密度可達的,那么對象p和q是關於ε和MinPts密度相連的
噪聲: 一個基於密度的簇是基於密度可達性的最大的密度相 連對象的集合。不包含在任何簇中的對象被認為是“噪聲”
邊界點:邊界點不是核心點,但落在某個核心點的鄰域內。
DBSCAN 算法根據以上的定義在數據庫中發現簇和噪聲。簇可等價於集合D中, 這個簇核心對象密度可達的所有對象的集合。
DBSCAN算法描述:
輸入:包含n個對象的數據庫,半徑ε,最少數目MinPts。
輸出:所有生成的簇,達到密度要求。
1.REPEAT
2.從數據庫中抽取一個未處理過的點;
3.IF 抽出的點是核心點 THEN找出所有從該點密度可達的對象,形成一個簇
4.ELSE 抽出的點是邊緣點(非核心對象),跳出本次循環,尋找下一點;
5.UNTIL 所有點都被處理;
DBSCAN算法步驟 :
輸入:數據集D,參數MinPts, ε 輸出:簇集合
(1) 首先將數據集D中的所有對象標記unvisited ;
(2) do
(3) 從D中隨機選取一個unvisited對象p,並將p標記為visited ;
(4) if p的 ε 鄰域 包含的對象數至少為MinPts個
(5) 創建新簇C ,並把p添加到c中;
(6) 令N為 p的 ε 鄰域 中對象的集合;
(7) for N 中每個點pi
(8) if pi 是unvisited
(9) 標記pi 為visited;
(10) if pi 的ε 鄰域 至少有MinPts個 對象,把這些對象添加到N ;
(11) if pi 還不是任何簇的對象。將 pi 添加到 簇C中 ;
(12) end for
(13) 輸出C
(14) Else 標記p 為噪聲
(15) Untill 沒有標記為unvisited 的對象
下面給出一個樣本事務數據庫(見下表),對它實施DBSCAN算法。
根據所給的數據通過對其進行DBSCAN算法,以下為算法的步驟(設n=12,用戶輸入ε=1,MinPts=4)
序列 | 屬性1 | 屬性2 |
1 | 2 | 1 |
2 | 5 | 1 |
3 | 1 | 2 |
4 | 2 | 2 |
5 | 3 | 2 |
6 | 4 | 2 |
7 | 5 | 2 |
8 | 6 | 2 |
9 | 1 | 3 |
10 | 2 | 3 |
11 | 5 | 3 |
12 | 2 | 4 |
DBSCAN聚類過程
第1步,在數據庫中選擇一點1,由於在以它為圓心的 以1為半徑的圓內包含2個點(小於4),因此它不是核心點,選擇下一個點。
第2步,在數據庫中選擇一點2,由於在以它為圓心的,以1為半徑的圓內包含2個點, 因此它不是核心點,選擇下一個點。
第3步,在數據庫中選擇一點3,由於在以它為圓心的,以1為半徑的圓內包含3個點, 因此它不是核心點,選擇下一個點。
第4步,在數據庫中選擇一點4,由於在以它為圓心的,以1為半徑的圓內包含5個點, 因此它是核心點,尋找從它出發可達的點(直接可達4個,間接可達3個), 聚出的新類{1,3,4,5,9,10,12},選擇下一個點。
第5步,在數據庫中選擇一點5,已經在簇1中,選擇下一個點。
第6步,在數據庫中選擇一點6,由於在以它為圓心的,以1為半徑的圓內包含3個點, 因此它不是核心點,選擇下一個點。
第7步,在數據庫中選擇一點7,由於在以它為圓心的,以1為半徑的圓內包含5個點, 因此它是核心點,尋找從它出發可達的點,聚出的新類{2,6,7,8,11},選擇下一個點。
第8步,在數據庫中選擇一點8,已經在簇2中,選擇下一個點。
第9步,在數據庫中選擇一點9,已經在簇1中,選擇下一個點。
第10步,在數據庫中選擇一點10,已經在簇1中,選擇下一個點。
第11步,在數據庫中選擇一點11,已經在簇2中,選擇下一個點。
第12步,選擇12點,已經在簇1中,由於這已經是最后一點所有點都以處理,程序終止。
算法執行過程
步驟 | 選擇的點 | 在ε中點的個數 | 通過計算可達到而找到新的簇 |
1 | 1 | 2 | 無 |
2 | 2 | 2 | 無 |
3 | 3 | 3 | 無 |
4 | 4 | 5 | 簇C1:{1,3,4,5,9,10,12} |
5 | 5 | 3 | 已在一個簇C1中 |
6 | 6 | 3 | 無 |
7 | 7 | 5 | 簇C2:{2,6,7,8,11} |
8 | 8 | 2 | 已在一個簇C2中 |
9 | 9 | 3 | 已在一個簇C1中 |
10 | 10 | 4 | 已在一個簇C1中 |
11 | 11 | 2 | 已在一個簇C2中 |
12 | 12 | 2 | 已在一個簇C1中 |
DBSCAN的時間復雜性:
DBSCAN算法要對每個數據對象進行鄰域檢查時間性能較低。
~DBSCAN的基本時間復雜度是 O(N*找出Eps領域中的點所需要的時間), N是點的個數。 最壞情況下時間復雜度是O(N2)
~在低維空間數據中,有一些數據結構如KD樹,使得可以有效的檢索特定點給定距離內的所有點, 時間復雜度可以降低到O(NlogN)
DBSCAM的空間復雜性:
在聚類過程中,DBSCAN一旦找到一個核心對象,即以該核心對象為中心向外擴展. 此過程中核心對象將不斷增多,未處理的對象被保留在內存中.若數據庫中存在龐大的聚類, 將需要很大的存來存儲核心對象信息,其需求難以預料.
當數據量增大時,要求較大的內存支持 I/0 消耗也很大;低維或高維數據中,其空間都是O(N)