1. 程式人生 > >R語言使用密度聚類筆法處理資料

R語言使用密度聚類筆法處理資料

說明

除了使用距離作為聚類指標,還可以使用密度指標來對資料進行聚類處理,將分佈稠密的樣本與分佈稀疏的樣本分離開。DBSCAN是最著名的密度聚類演算法。

操作

將使用mlbench包提供的模擬資料

library(mlbench)
library(fpc)

使用mlbench庫繪製Cassini問題圖:

set.seed(2)
p = mlbench.cassini(500)
plot(p$x)

Cassini問題圖
根據資料密度完成聚類:

ds = dbscan(dist(p$x),0.2,2,countmode = NULL,method = "dist")
> ds
dbscan Pts=500
MinPts=2 eps=0.2 1 2 3 seed 200 200 100 total 200 200 100

繪製聚類結果散點圖,屬於不同簇的資料點選用不的顏色:

plot(ds,p$x)

根據聚簇標號繪製的彩色散點圖
呼叫dbscan來預測資料點可能被劃分到那個簇,在樣例中,首先在矩陣P中處理三個輸入值:
生成y矩陣

y = matrix(0,nrow = 3,ncol = 2)
y[1,] = c(0,0)
y[2,] = c(0,-1.5)
y[3,] = c(1,1)
y
[,1] [,2]
[1,]    0  0.0
[2,]    0 -1.5
[3,]    1  1.0

預測資料點屬於那個簇:

predict(ds,p$x,y)
[1] 3 1 2

原理

基於密度的聚類演算法利用了密度可達以及密度相連的特點,因而適用於處理非線性聚類問題。當探討密度聚類演算法的處理過程前,我們要知道基於密度的聚類演算法通常需要考慮兩個引數,eps和MinPts,其中eps為最大領域半徑,MinPts是領域半徑範圍內的最小點數。
確定好這兩個引數後,如果給定物件其領域範圍內的樣本點個數大於MinPts,則稱該物件為核心點。
如果一個物件其領域半徑範圍內的樣本點個數小於MinPts,但緊挨著核心點,則稱該物件為邊緣點。
如果P物件的eps領域範圍內樣本點個數大於MinPts,則稱該物件為核心物件。
進一步,我們還要定義兩點間密度可達的概念,給定兩點p和q,如果p為核心物件,且q在p的eps鄰域內,則稱p直接密度可以達q。如果存在一系列的點,p1,p2,…,pn。且p1 = q,pn = p,根據Eps和MinPts的值,當1<=i<=n,pi + 1 直接密度可以達pi,則稱p的一般密度可以達q。
DBSCAN處理過程:
1.隨機選擇一個點p
2.給定Eps和MinPts的條件下,獲得所有p密度可達的點
3.如果p是核心物件,則p和所有p密度可達的點被標記成一個簇,如果p是一個邊緣點,找不到密度可達點,則將其標記為噪聲。接著處理其它點。
4.重複這個過程,直到所有的點被處理。
本例使用dbscan演算法聚類Cassini資料集,將可達距離設定為0.2,最小可達點個數設定為2,計算進度設為NULL,使用距離矩陣做為計算依據。經過演算法處理,資料被劃分成三個簇,每個簇的大小分別為200,200,100.通過聚簇的結果示意圖也可以發現Cassini圖被不同顏色區分開來。