1. 程式人生 > >演算法設計:基於密度的聚類方法

演算法設計:基於密度的聚類方法

1、前言

我們生活在資料大爆炸時代,每時每刻都在產生海量的資料如視訊,文字,影象和部落格等。由於資料的型別和大小已經超出了人們傳統手工處理的能力範圍,聚類,作為一種最常見的無監督學習技術,可以幫助人們給資料自動打標籤,已經獲得了廣泛應用。聚類的目的就是把不同的資料點按照它們的相似與相異度分割成不同的簇(注意:簇就是把資料劃分後的子集),確保每個簇中的資料都是儘可能相似,而不同的簇裡的資料儘可能的相異。從模式識別的角度來講,聚類就是在發現數據中潛在的模式,幫助人們進行分組歸類以達到更好理解資料的分佈規律。

聚類的應用非常廣泛,比如在商業應用方面,聚類可以幫助市場營銷人員將客戶按照他們的屬性分層,發現不同的客戶群和他們的購買傾向(如下圖將客戶按照他們對顏色喜好歸類)。這樣公司就可以尋找潛在的市場,更高效地開發制定化的產品與服務。在文字分析處理上,聚類可以幫助新聞工作者把最新的微博按照的話題相似度進行分類,而快速得出熱點新聞和關注物件。在生物醫學上,可以根據對相似表達譜的基因進行聚類,從而知道未知基因的功能。

由於聚類是無監督學習方法,不同的聚類方法基於不同的假設和資料型別,比如基於。由於資料通常可以以不同的角度進行歸類,因此沒有萬能的通用聚類演算法,並且每一種聚類演算法都有其侷限性和偏見性。也就是說某種聚類演算法可能在市場資料上效果很棒,但是在基因資料上就無能為力了。

聚類演算法很多,包括基於劃分的聚類演算法(如:k-means),基於層次的聚類演算法(如:BIRCH),基於密度的聚類演算法(如:DBSCAN),基於網格的聚類演算法( 如:STING )等等。本文將介紹聚類中一種最常用的方法——基於密度的聚類方法(density-based clustering)。

一、演算法思想:  

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一個比較有代表性的基於密度的聚類演算法。與劃分和層次聚類方法不同,它將簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區域劃分為簇,並可在噪聲的空間資料庫中發現任意形狀的聚類。

DBSCAN中的幾個定義:

  • Ε鄰域:給定物件半徑為Ε內的區域稱為該物件的Ε鄰域;
  • 核心物件:如果給定物件Ε領域內的樣本點數大於等於MinPts,則稱該物件為核心物件;
  • 直接密度可達:對於樣本集合D,如果樣本點q在p的Ε領域內,並且p為核心物件,那麼物件q從物件p直接密度可達。
  • 密度可達:對於樣本集合D,給定一串樣本點p1,p2….pn,p= p1,q= pn,假如物件pi從pi-1直接密度可達,那麼物件q從物件p密度可達。
  • 密度相連:存在樣本集合D中的一點o,如果物件o到物件p和物件q都是密度可達的,那麼p和q密度相聯。

  可以發現,密度可達是直接密度可達的傳遞閉包,並且這種關係是非對稱的。密度相連是對稱關係。DBSCAN目的是找到密度相連物件的最大集合。

Eg: 假設半徑Ε=3,MinPts=3,點p的E領域中有點{m,p,p1,p2,o}, 點m的E領域中有點{m,q,p,m1,m2},點q的E領域中有點{q,m},點o的E領域中有點{o,p,s},點s的E領域中有點{o,s,s1}.

  那麼核心物件有p,m,o,s(q不是核心物件,因為它對應的E領域中點數量等於2,小於MinPts=3);

  點m從點p直接密度可達,因為m在p的E領域內,並且p為核心物件;

  點q從點p密度可達,因為點q從點m直接密度可達,並且點m從點p直接密度可達;

  點q到點s密度相連,因為點q從點p密度可達,並且s從點p密度可達。

二、演算法優點:

1. 與K-means方法相比,DBSCAN不需要事先知道要形成的簇類的數量。

2. 與K-means方法相比,DBSCAN可以發現任意形狀的簇類。

3. 同時,DBSCAN能夠識別出噪聲點。對離群點有較好的魯棒性,甚至可以檢測離群點。

4.DBSCAN對於資料庫中樣本的順序不敏感,即Pattern的輸入順序對結果的影響不大。但是,對於處於簇類之間邊界樣本,可能會根據哪個簇類優先被探測到而其歸屬有所擺動。

5.DBSCAN被設計與資料庫一同使用,可以加速區域的查詢。例如 使用R*樹。

其核心思想就是先發現密度較高的點,然後把相近的高密度點逐步都連成一片,進而生成各種簇。演算法實現上就是,對每個資料點為圓心,以eps為半徑畫個圈(稱為鄰域eps-neigbourhood),然後數有多少個點在這個圈內,這個數就是該點密度值。然後我們可以選取一個密度閾值MinPts,如圈內點數小於MinPts的圓心點為低密度的點,而大於或等於MinPts的圓心點高密度的點(稱為核心點Core point)。如果有一個高密度的點在另一個高密度的點的圈內,我們就把這兩個點連線起來,這樣我們可以把好多點不斷地串聯出來。之後,如果有低密度的點也在高密度的點的圈內,把它也連到最近的高密度點上,稱之為邊界點。這樣所有能連到一起的點就成一了個簇,而不在任何高密度點的圈內的低密度點就是異常點。下圖展示了DBSCAN的工作原理。

 

這裡寫圖片描述

當設定MinPts=4的時候,紅點為高密度點,藍點為異常點,黃點為邊界點。紅黃點串成一起成了一個簇。

 

由於DBSCAN是靠不斷連線鄰域內高密度點來發現簇的,只需要定義鄰域大小和密度閾值,因此可以發現不同形狀,不同大小的簇。下圖展示了一個二維空間的DBSCAN聚類結果。

 

這裡寫圖片描述

DBSCAN可以發現2個弧形的簇

 

DBSCAN演算法偽碼錶達如下:

這裡寫圖片描述

DBSCAN實現偽碼(來源: Han 2011)

 

3、發現不同密度的簇

由於DBSCAN使用的是全域性的密度閾值MinPts, 因此只能發現密度不少於MinPts的點組成的簇,即很難發現不同密度的簇。其成功與失敗的情況舉例如下:

這裡寫圖片描述

左圖有三個簇,一個全域性密度閾值可以把三個簇分開。但是在右圖中,一個閾值無法把三個簇分開,過高的閾值會把C3全部變成異常點,過低的閾值會把C1和C2合併起來。(來源:http://www.sciencedirect.com/science/article/pii/S0031320316301571

 

為了解決其發現不同密度的簇,目前已經有很多新的方法被髮明出來,比如OPTICS(Ordering points to identify the clustering structure)將鄰域點按照密度大小進行排序,再用視覺化的方法來發現不同密度的簇,如下圖所示。OPTICS必須由其他的演算法在視覺化的圖上查詢“山谷”來發現簇,因此其效能直接受這些演算法的約束。

 

這裡寫圖片描述

OPTICS將資料以密度的形式排序並展示,不同的山谷就是不同密度大小的簇。(來源:https://en.wikipedia.org/wiki/OPTICS_algorithm

 

另外SNN採用一種基於KNN(最近鄰)來算相似度的方法來改進DBSCAN。對於每個點,我們在空間內找出離其最近的k個點(稱為k近鄰點)。兩個點之間相似度就是數這兩個點共享了多少個k近鄰點。如果這兩個點沒有共享k近鄰點或者這兩個點都不是對方的k近鄰點,那麼這兩個點相似度就是0。然後我們把DBSCAN裡面的距離公式替換成SNN相似度,重新算每個點的鄰域和密度,就可以發現不同密度的簇了。SNN的核心就是,把原始的密度計算替換成基於每對點之間共享的鄰域的範圍,而忽略其真實的密度分佈。SNN的缺點就是必須定義最近鄰個數k, 而且其效能對k的大小很敏感。下圖展示了SNN計算相似度的方法。



這裡寫圖片描述

i 點和 j 點共享4個近鄰點,所以它們相似度為4

2014年Science雜誌刊登了一種基於密度峰值的演算法DP(Clustering by fast search and find of density peaks),也是採用視覺化的方法來幫助查詢不同密度的簇。其思想為每個簇都有個最大密度點為簇中心,每個簇中心都吸引並連線其周圍密度較低的點,且不同的簇中心點都相對較遠。為實現這個思想,它首先計算每個點的密度大小(也是數多少點在鄰域eps-neigbourhood內),然後再計算每個點到其最近的且比它密度高的點的距離。這樣對每個點我們都有兩個屬性值,一個是其本身密度值,一個是其到比它密度高的最近點的距離值。對這兩個屬性我們可以生成一個2維圖表(決策圖),那麼在右上角的幾個點就可以代表不同的簇的中心了,即密度高且離其他簇中心較遠。然後我們可以把其他的點逐步連線到離其最近的且比它密度高的點,直到最後連到某個簇中心點為止。這樣所有共享一個簇中心的點都屬於一個簇,而離其他點較遠且密度很低的點就是異常點了。由於這個方法是基於相對距離和相對密度來連線點的,所以其可以發現不同密度的簇。DP的缺陷就在於每個簇必須有個最大密度點作為簇中心點,如果一個簇的密度分佈均與或者一個簇有多個密度高的點,其就會把某些簇分開成幾個子簇。另外DP需要使用者指定有多少個簇,在實際操作的時候需要不斷嘗試調整。下圖展示了一個DP生成的決策圖。



這裡寫圖片描述

左圖為5個簇的分佈,右圖為DP生成的決策圖,其右上角5個點就是左圖五個簇的中心點。(來源:http://science.sciencemag.org/content/344/6191/1492


 

 

除此之外,還可以用密度比估計(Density-ratio estimation)來克服DBSCAN無法發現不同密度簇的缺陷。密度比的核心思想就是對每個點,計算其密度與其鄰域密度的比率,然後用密度比計算替換DBSCAN的密度計算來發現核心點Core point,而其他過程和DBSCAN不變。這樣一來,每個區域性高密度點就會被選出來作為核心點,從而發現不同密度的簇。基於這個思想,我們還可以把原始資料按其密度分佈進行標準化(ReScale),即把密度高的區域進行擴張,密度低的區域繼續收縮。這樣以來,不同密度的簇就可以變成密度相近的簇了,我們再在標準化後的資料上直接跑DBSCAN就搞定了。這種方法需要使用者設定鄰域範圍來計算密度比,下圖展示了標準化前後的資料分佈對比。

 

這裡寫圖片描述

不同密度的簇在(ReScale)標準化後,變成密度相近的簇,進而DBSCAN可以用全域性閾值發現不同的簇

 

4、討論

基於密度的聚類是一種非常直觀的聚類方法,即把臨近的密度高的區域練成一片形成簇。該方法可以找到各種大小各種形狀的簇,並且具有一定的抗噪音特性。在日常應用中,可以用不同的索引方法或用基於網格的方法來加速密度估計,提高聚類的速度。基於密度的聚類也可以用在流資料和分散式資料中,關於其他方向的應用,詳見(Aggarwal 2013).

5、原始碼下載 (Matlab)

DP: https://au.mathworks.com/matlabcentral/fileexchange/53922-densityclust

DBSCAN, SNN, OPTICS 和 Density-ratio: https://sourceforge.net/projects/density-ratio/

三、演算法缺點:

1. DBScan不能很好反映高維資料。

2. DBScan不能很好反映資料集以變化的密度。

3.由於DBSCAN演算法直接對整個資料集進行操作,並且在聚類之前需要建立相應的R*樹,並繪製k-dist圖,因此演算法所需的記憶體空間和I/O消耗都相當可觀。在計算資源有限而資料量又非常龐大的情況下,DBSCAN演算法的效率將受到很大影響。(DBSCAN演算法將區域查詢得到的所有未被處理過的點都作為種子點,留待下一步擴充套件處理。對於大規模資料集中的較大類而言,這種策略會使種子點的數目不斷膨脹,演算法所需的記憶體空間也會快速增加。)

4.由於DBSCAN演算法使用了全域性性表徵密度的引數,因此當各個類的密度不均勻,或類間的距離相差很大時,聚類的質量較差。(當各個類的密度不均勻、或類間的距離相差很大時,如果根據密度較高的類選取較小的Eps值,那麼密度相對較低的類中的物件Eps 鄰域中的點數將小Minpts,則這些點將會被錯當成邊界點,從而不被用於所在類的進一步擴充套件,因此導致密度較低的類被劃分成多個性質相似的類。與此相反,如果根據密度較低的類來選取較大的Eps值,則會導致離得較近而密度較大的類被合併,而它們之間的差異被忽略。所以在上述情況下,很難選取一個合適的全域性Eps值來獲得比較準確的聚類結果。)

5.DBSCAN不是完全確定的,邊界點從不同的簇中獲得,可以使不同簇的一部分,取決於資料處理。

6.DBSCAN的質量取決於regionQuery(P,Eps)函式中距離的測量。最常用的距離度量是歐式距離,尤其是在高維資料中,由於所謂的維數災難,這種度量基本上是無用的,很難為E找到一個恰當的值。雖然目前有一些基於歐式距離的演算法,但是如果不能對資料和規模有很好的瞭解,也很難找一個有意義的距離閾值E。

7.當密度差異大時,由於選取的MinPts-Eps組合不能同時適合所有的簇,DBSACN不能很好的進行資料聚類。(缺點4)

8.輸入引數敏感,確定引數Eps , MinPts困難 ,若選取不當 ,將造成聚類質量下降。

9.由於經典的DBSCAN演算法中引數Eps和MinPts在聚類過程中是不變的,使得該演算法難以適應密度不均勻的資料集.