原理解析:

1.从数据集中选择一个未处理的样本点

2.以1为圆心,做半径为E的圆,由于圆内圈入点的个数为3,满足密度阈值Minpts,因此称点1为核心对象(黑色实心圆点),且将圈内的4个点形成一个簇,其中点1直接密度可达周围的3个灰色实心原点

3.重复步骤2若干次,其中点1直接密度可达核心对象3,且点2密度可达点3

4.当该过程进行到图Ⅳ,4的E邻域内仅有2个点,小阈值MinPts,因此点4为边缘点(非核心对象),记为ⓧ,继续考察其他点.

5.当所有对象都被考察,该过程结束,得到图Ⅷ.椭圆形内有若干核心对象和边缘点,这些点都是密度相连的.

6.为个点归类,如图Ⅸ:点集黑圈相互密度可达,属于类别1:点集黑三角相互密度可达,属于新的一类,记为类别2;点集白圈与类别1样本点密度相连,属于类别3;点集白三角与类别2样本点密度相连,属于类别4;点ⓧ既非核心对象,也不密度相连,为噪声点.

在R语言中的应用-基于密度的聚类

k-means聚类,算法非常简单,而且速度很快,但是,其缺点在于不能识别非球形的簇,可以使用DBSCAN(基于密度)寻找那些被低密度区域所分离的高密度。

重要概念:

核心点:如果某个点的邻域内的点的个数超过某个阈值,则它是一个核心点,即表示他位于簇的内部

边界点:某个点不是核心点,但落在核心点的邻域内

噪声点:非核心点也非边界点

密度聚类(Density-based Methods)主要应用到了fpc包中的dbscan函数。

eps:定义邻域的半径大小

MinPts:定义阈值以判断核心点

噪声点:非核心点也非边界点

基于密度聚类可以对抗噪声,能处理任意形状和大小的簇,可以发现k均值不能发现的簇,但是对于高维数据,点极为稀疏,密度就很难定义了,而且对于计算资源的消耗也很大


dbscan(data,eps,MinPts=5,scale=FALSE,method=c(“hybird”,”raw”,”dist”),seeds=TRUE,showplot=FALSE,countmode=NULL)

以iris数据集为例进行分析

# 应用模型并查看模型的相应参数 
library(fpc)
ds <- dbscan(iris[,-5], eps=0.2, MinPts=3)

plot(ds, iris[,1:2])

plot(ds, iris[,3:4])

plot(ds, iris[,-5])

ds[1:length(ds)]
## $cluster
##   [1] 1 2 2 2 1 0 0 1 0 2 0 0 2 0 0 0 0 1 0 3 0 3 0 0 0 2 0 1 1 2 2 0 0 0 2
##  [36] 0 0 1 0 1 1 0 0 0 0 2 3 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 4
##  [71] 0 0 0 0 0 0 0 0 6 0 4 4 0 0 0 0 0 0 5 0 0 6 0 0 5 5 5 0 0 5 0 0 0 0 0
## [106] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [141] 0 0 0 0 0 0 0 0 0 0
## 
## $eps
## [1] 0.2
## 
## $MinPts
## [1] 3
## 
## $isseed
##   [1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE
##  [12] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE
##  [23] FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
##  [34] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE FALSE
##  [45] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
##  [56] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [67] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [78] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [89]  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
## [100]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [111] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [122] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [144] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
class(ds)
## [1] "dbscan"
str(ds)
## List of 4
##  $ cluster: num [1:150] 1 2 2 2 1 0 0 1 0 2 ...
##  $ eps    : num 0.2
##  $ MinPts : num 3
##  $ isseed : logi [1:150] TRUE TRUE FALSE TRUE TRUE FALSE ...
##  - attr(*, "class")= chr "dbscan"