基於密度聚類的DBSCAN和kmeans算法比較

基於密度聚類的DBSCAN和kmeans算法比較

根據各行業特性,人們提出了多種聚類算法,簡單分爲:基於層次、劃分、密度、圖論、網格和模型的幾大類。

其中,基於密度的聚類算法以DBSCAN最具有代表性。

 

 場景 一

假設有如下圖的一組數據, 生成數據的R代碼如下

複製代碼
x1 <- seq(0,pi,length.out=100)
y1 <- sin(x1) + 0.1*rnorm(100)
x2 <- 1.5+ seq(0,pi,length.out=100)
y2 <- cos(x2) + 0.1*rnorm(100)
data <- data.frame(c(x1,x2),c(y1,y2))
names(data) <- c('x','y')    
qplot(data$x, data$y)
           
複製代碼

 

 

用密度聚類DBSCAN方法,可以看到聚類效果如下:

library(ggplot2)
p <- ggplot(data,aes(x,y))
library('fpc')
model2 <- dbscan(data,eps=0.6,MinPts=4)
p + geom_point(size=2.5, aes(colour=factor(model2$cluster)))+theme(legend.position='top')

同樣,請讀者看下k-means的聚類效果。

# 用K均值聚類
model1 <- kmeans(data,centers=2,nstart=10)
library(ggplot2)
p <- ggplot(data,aes(x,y))
p + geom_point(size=2.5,aes(colour=factor(model1$cluster)))+theme(legend.position='top')

場景 二

 

 假設有如下一組數據,生成數據的R代碼如下。

set.seed(665544)
n <- 600
data <- data.frame(cbind(runif(10, 0, 10)+rnorm(n, sd=0.2), runif(10, 0, 10)+rnorm(n,sd=0.2)))
names(data) <- c('x','y')
library(ggplot2)
qplot(data$x, data$y)

 

筆者用k-means聚類效果如下

# 用K均值聚類
model1 <- kmeans(data,centers=10,nstart=10)
library(ggplot2)
p <- ggplot(data,aes(x,y))
p + geom_point(size=2.5,aes(colour=factor(model1$cluster)))+theme(legend.position='top')

 

用dbscan算法聚類效果如下。

#用dbscan聚類
p <- ggplot(data,aes(x,y))
library('fpc')
model2 <- dbscan(data,eps=0.2,MinPts=5)
p + geom_point(size=2.5, aes(colour=factor(model2$cluster)))+theme(legend.position='top')

請注意觀察兩個算法的不同之處。

 

1 dbscan是基於密度計算聚類的,會剔除異常(噪聲點)。如上圖中的類別0,就是dbscan算法聚類出的噪聲點(不是核心點且不再核心點的鄰域內)。

2 k-means需要指定k值,並且初始聚類中心對聚類結果影響很大。

3 k-means把任何點都歸到了某一個類,對異常點比較敏感。

 

 

其它的觀點。來自《數據挖掘導論》[美]Pang-Ning Tan,Michael Steinbach,Vipin Kumar 著 page355-356

爲了簡化比較,我們假定對於K均值和DBSCAN都沒有距離的限制,並且DBSCAN總是將與若干個核心點相關聯的邊界點指派到最近的核心點。

1. K均值和DBSCAN都是將每個對象指派到單個簇的劃分聚類算法,但是K均值一般聚類所有對象,而DBSCAN丟棄被它識別爲噪聲的對象。

2. K均值使用簇的基於原型的概念,而DBSCAN使用基於密度的概念。

3. K均值很難處理非球形的簇和不同大小的簇。DBSCAN可以處理不同大小或形狀的簇,並且不太受噪聲和離羣點的影響。當簇具有很不相同的密度時,兩種算法的性能都很差。

4. K均值只能用於具有明確定義的質心(比如均值或中位數)的數據。DBSCAN要求密度定義(基於傳統的歐幾里得密度概念)對於數據是有意義的。

5. K均值可以用於稀疏的高維數據,如文檔數據。DBSCAN通常在這類數據上的性能很差,因爲對於高維數據,傳統的歐幾里得密度定義不能很好處理它們。

6. K均值和DBSCAN的最初版本都是針對歐幾里得數據設計的,但是它們都被擴展,以便處理其他類型的數據。

7. 基本K均值算法等價於一種統計聚類方法(混合模型),假定所有的簇都來自球形高斯分佈,具有不同的均值,但具有相同的協方差矩陣。DBSCAN不對數據的分佈做任何假定。

8. K均值DBSCAN和都尋找使用所有屬性的簇,即它們都不尋找可能只涉及某個屬性子集的簇。

9. K均值可以發現不是明顯分離的簇,即便簇有重疊也可以發現,但是DBSCAN會合並有重疊的簇。

10. K均值算法的時間複雜度是O(m),而DBSCAN的時間複雜度是O(m^2),除非用於諸如低維歐幾里得數據這樣的特殊情況。

11. DBSCAN多次運行產生相同的結果,而K均值通常使用隨機初始化質心,不會產生相同的結果。

12. DBSCAN自動地確定簇個數,對於K均值,簇個數需要作爲參數指定。然而,DBSCAN必須指定另外兩個參數:Eps(鄰域半徑)和MinPts(最少點數)。

13. K均值聚類可以看作優化問題,即最小化每個點到最近質心的誤差平方和,並且可以看作一種統計聚類(混合模型)的特例。DBSCAN不基於任何形式化模型。

 

所以,不同的數據集和場景,需要運用不同的聚類算法。

 

下面介紹該算法的工作原理。

 

 

 

 

 其中,DBSCAN方法對參數eps和MinPts敏感。  

在這個算法框架中,NEps(x, D)表示數據集D中包含在對象x的Eps-鄰域範圍內的
所有子對象。card(N)表示集合N的基數,即集合N中包含的元素的個數。在簇擴展
過程中採用了棧結構,用於壓棧當前對象x的所有鄰居對象,再遞歸地判斷棧成員
是否滿足核心對象條件,從而決定是否進一步擴展。

 

後記:

1 關於算法的一般性介紹,可參看百度百科介紹。http://baike.baidu.com/link?url=cnLtGJsF_a4CzmVbAev3nFH75nZUMgwClKv_kk2ZsXuXrP1gvY8eMvY75UDL29AMJFJ2n60xB680PMkjitrG4a

 

2 按照上述的算法流程,作者寫了java代碼放入了百度雲盤(含上述測試數據),有興趣的讀者請自行下載。http://pan.baidu.com/s/1ntwyXkP

 

3 參考文獻 《針對非均勻數據集的DBSCAN聚類算法研究》 重慶大學碩士學位論文   陳若田   二O 一三年四月  http://pan.baidu.com/s/1mgvKR7U

 

4 Clustering     http://scikit-learn.org/stable/modules/clustering.html#spectral-clustering

 

5 python DBSCAN源碼  http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py

 

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章