1. 程式人生 > >基於R的聚類分析(DBSCAN,基於密度的聚類分析)

基於R的聚類分析(DBSCAN,基於密度的聚類分析)

DBSCAN聚類分析(基於R語言)
在上一講中,主要是給大家介紹了,K-means聚類,層次聚類這兩種聚類方法是最為典型的兩種聚類方法。K-means聚類基本原理是這樣的,在n個樣本點中,首先提前設定要聚類幾類,比如說要聚成三類,那麼在n個樣本點中先隨機選擇三個點,最為初始點,將剩下的n-3個點按照距離的原則(所謂聚類原則就是哪個點距離它近,就將這個點分配給它),分別分配到這三個點。這樣的話,就初步形成三大類點了。每一大類的中心值作為新的中心點,再重新安裝距離的原則進行重新分配,不斷重複,直至聚類中心穩定。而層次聚類呢,首先是求得所有樣本點的兩兩相似性。在此基礎上就可以形成層次關係,最終是由我們自己確定聚為幾類,比如說,我們要聚成三類,那麼就沿著層次結構圖橫著畫一條線,線下剛好三類。
在這一講當中,我們介紹一種新的聚類方法,叫DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚類法,也是非常經典的一個演算法了。是基於密度的聚類演算法,首先說為什麼會有這種聚類演算法,而且為什麼是基於密度的。基於密度有啥好處。我們首先說,為什麼需要這種聚類演算法。我們通過程式碼來說明。首先我們先產生一個待聚類的樣本點,並且利用R將其畫出來,如下

#載入包
library(factoextra)
librar(ggplot2)
data("multishapes")
df <- multishapes[, 1:2]
df0<-multishapes
df0$shape<-as.factor(df0$shape)
ggplot(df0,aes(x=x,y=y,colour=shape))+geom_point()

樣本點是這個樣子的
待聚類樣本點
大家看這個樣本點,每一種顏色代表一類,大體上看,是五類,兩個圈代表兩類,兩條線代表兩類,另個的一堆點代表一類。大家說,我們要是拿k-means聚類演算法進行聚類,能不能準確地分出來這五類呢。那麼我們就試試,並且畫出聚類效果圖,程式碼如下:

set.seed(123)
km_result <- kmeans(df, 5, nstart = 25)
fviz_cluster(km_result , df, geom = "point",
             ellipse= FALSE, show.clust.cent = FALSE,
             palette = "jco", ggtheme = theme_classic())

根據k-means對上述資料聚類結果如下:
基於k-means的聚類結果
oh,my god,這麼成這個樣子了。完全不是我們想要的結果。這樣我們就回答了第一個問題,為什麼需要基於密度的聚類演算法,因為像這種奇奇怪怪形狀的樣本點,我們利用k-means演算法根本無法將其進行聚類。那麼基於密度的聚類演算法為啥可以解決。大家看看這個圖,每一類就是一些點密集地連線在一起。密集地也就是代表了密度的不同,所以這裡大家就知道了,這個密度不是我們平時說的概率密度分佈。實際上是一種樣本密度的代表。那麼我們再看看DBCSAN演算法,在這種樣本下表現如下,程式碼如下:

#載入相關包
library("fpc")
#設定隨機數種子
set.seed(123)
db <- fpc::dbscan(df, eps = 0.15, MinPts = 5)
fviz_cluster(db, data = df, stand = FALSE,
             ellipse = FALSE, show.clust.cent = FALSE,
             geom = "point",palette = "jco", ggtheme = theme_classic())

是這個樣子的基於密度的聚類
哈哈,效果非常好,大家看到了吧,所以說基於密度的聚類演算法就適用這種奇奇怪怪的樣本點。可能大家想知道為什麼DBSCAN可以做到,數學推導方面,我後面會給大家介紹。