标签:
根据各行业特性,人们提出了多种聚类算法,简单分为:基于层次、划分、密度、图论、网格和模型的几大类。
其中,基于密度的聚类算法以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
(完)
标签:
原文地址:http://www.cnblogs.com/hdu-2010/p/4621258.html