kmean法和dbscan法的直观比较

来源:互联网 发布:什么是字符串数组 编辑:程序博客网 时间:2024/05/22 01:38
转自:kmean法和dbscan法的直观比较
K均值聚类使用非常广泛,作为更为古老的聚类方法,它的算法非常简单,而且速度很快。但是其缺点在于它不能识别非球形的簇。我们可以用一个简单的例子来观察K均值聚类的弱点。我们先构造一些人为数据,它是基于sin函数和cos函数构成的两组点。如果我们用传统的K均值聚类,结果如下图所示。其聚类结果是不理想的,因为它不能识别非球形的簇。
 


DBSCAN的算法是将所有点标记为核心点、边界点或噪声点,将任意两个距离小于eps的核心点归为同一个簇。任何与核心点足够近的边界点也放到与之相同的簇中。下面我们来使用R语言中的fpc包来对上面的例子实施密度聚类。其中eps参数设为0.6,即两个点之间距离小于0.6则归为一个簇,而阀值MinPts设为4。


从上图可以看到,DBSCAN方法很好的划分了两个簇。其中要注意参数eps的设置,如果eps设置过大,则所有的点都会归为一个簇,如果设置过小,那么簇的数目会过多。如果MinPts设置过大的话,很多点将被视为噪声点。

从这个例子中,我们可以看到基于密度聚类的优良特性,它可以对抗噪声,能处理任意形状和大小的簇,这样可以发现K均值不能发现的簇。但是对于高维数据,点之间极为稀疏,密度就很难定义了。

 



实现代码如下:
# 生成数据
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')

# 用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)))+
               opts(legend.position='top')

# 用fpc包中的dbscan函数进行密度聚类
library('fpc')
model2 <- dbscan(data,eps=0.6,MinPts=4)
p + geom_point(size=2.5, aes(colour=factor(model2$cluster)))+
               opts(legend.position='top')
以上为转载