码迷,mamicode.com
首页 > 数据库 > 详细

基于密度聚类的DBSCAN算法

时间:2015-07-04 22:08:57      阅读:384      评论:0      收藏:0      [点我收藏+]

标签:

根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次、划分、密度、图论、网格和模型的几大类。

其中,基于密度的聚类算法以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)

技术分享

 所以,不同的数据集和场景,需要运用不同的聚类算法。

 

下面介绍该算法的工作原理。

 

技术分享

 

 

 

 其中,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/1i3J7Adf

 

3 参考文献 《针对非均匀数据集的DBSCAN聚类算法研究》 重庆大学硕士学位论文   陈若田   二O 一三年四月  http://pan.baidu.com/s/1mgvKR7U

 

(完)

 

基于密度聚类的DBSCAN算法

标签:

原文地址:http://www.cnblogs.com/hdu-2010/p/4621258.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!