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;点ⓧ既非核心对象,也不密度相连,为噪声点.
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)
# 应用模型并查看模型的相应参数
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"