基于密度聚类的DBSCAN和kmeans算法比较

基于密度聚类的DBSCAN和kmeans算法比较

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

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

场景 二

 

 假设有如下一组数据,生成数据的R代码如下。

set.seed(665544)
n <- 600
data <- data.frame(cbind(runif(10, 0, 10)+rnorm(n, sd=0.2), runif(10, 0, 10)+rnorm(n,sd=0.2)))
names(data) <- c('x','y')
library(ggplot2)
qplot(data$x, data$y)

 

笔者用k-means聚类效果如下

# 用K均值聚类
model1 <- kmeans(data,centers=10,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算法聚类效果如下。

#用dbscan聚类
p <- ggplot(data,aes(x,y))
library('fpc')
model2 <- dbscan(data,eps=0.2,MinPts=5)
p + geom_point(size=2.5, aes(colour=factor(model2$cluster)))+theme(legend.position='top')

请注意观察两个算法的不同之处。

 

1 dbscan是基于密度计算聚类的,会剔除异常(噪声点)。如上图中的类别0,就是dbscan算法聚类出的噪声点(不是核心点且不再核心点的邻域内)。

2 k-means需要指定k值,并且初始聚类中心对聚类结果影响很大。

3 k-means把任何点都归到了某一个类,对异常点比较敏感。

 

 

其它的观点。来自《数据挖掘导论》[美]Pang-Ning Tan,Michael Steinbach,Vipin Kumar 著 page355-356

为了简化比较,我们假定对于K均值和DBSCAN都没有距离的限制,并且DBSCAN总是将与若干个核心点相关联的边界点指派到最近的核心点。

1. K均值和DBSCAN都是将每个对象指派到单个簇的划分聚类算法,但是K均值一般聚类所有对象,而DBSCAN丢弃被它识别为噪声的对象。

2. K均值使用簇的基于原型的概念,而DBSCAN使用基于密度的概念。

3. K均值很难处理非球形的簇和不同大小的簇。DBSCAN可以处理不同大小或形状的簇,并且不太受噪声和离群点的影响。当簇具有很不相同的密度时,两种算法的性能都很差。

4. K均值只能用于具有明确定义的质心(比如均值或中位数)的数据。DBSCAN要求密度定义(基于传统的欧几里得密度概念)对于数据是有意义的。

5. K均值可以用于稀疏的高维数据,如文档数据。DBSCAN通常在这类数据上的性能很差,因为对于高维数据,传统的欧几里得密度定义不能很好处理它们。

6. K均值和DBSCAN的最初版本都是针对欧几里得数据设计的,但是它们都被扩展,以便处理其他类型的数据。

7. 基本K均值算法等价于一种统计聚类方法(混合模型),假定所有的簇都来自球形高斯分布,具有不同的均值,但具有相同的协方差矩阵。DBSCAN不对数据的分布做任何假定。

8. K均值DBSCAN和都寻找使用所有属性的簇,即它们都不寻找可能只涉及某个属性子集的簇。

9. K均值可以发现不是明显分离的簇,即便簇有重叠也可以发现,但是DBSCAN会合并有重叠的簇。

10. K均值算法的时间复杂度是O(m),而DBSCAN的时间复杂度是O(m^2),除非用于诸如低维欧几里得数据这样的特殊情况。

11. DBSCAN多次运行产生相同的结果,而K均值通常使用随机初始化质心,不会产生相同的结果。

12. DBSCAN自动地确定簇个数,对于K均值,簇个数需要作为参数指定。然而,DBSCAN必须指定另外两个参数:Eps(邻域半径)和MinPts(最少点数)。

13. K均值聚类可以看作优化问题,即最小化每个点到最近质心的误差平方和,并且可以看作一种统计聚类(混合模型)的特例。DBSCAN不基于任何形式化模型。

 

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

 

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

 

 

 

 

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

 

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

 

4 Clustering     http://scikit-learn.org/stable/modules/clustering.html#spectral-clustering

 

5 python DBSCAN源码  http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py

 

(完)

<h3>回答1:</h3><br/>DBSCAN和K-means都是聚类算法,但它们有不同的特点和适用场景。 DBSCAN是一种基于密度聚类算法,它能够发现任意形状的簇,并且能够处理噪声数据。它的核心思想是将数据点分为核心点、边界点和噪声点三类,通过密度可达性来确定簇的边界。DBSCAN的优点是不需要预先指定簇的个数,能够处理任意形状的簇,并且对噪声数据有很好的鲁棒性。但是,DBSCAN对于高维数据和不同密度的簇的处理效果不如K-means。 K-means是一种基于距离的聚类算法,它将数据点分为K个簇,每个簇的中心点是该簇中所有数据点的平均值。K-means的优点是算法简单,计算速度快,对于高维数据和同密度的簇的处理效果较好。但是,K-means需要预先指定簇的个数,对于不同密度的簇和噪声数据的处理效果不如DBSCAN。 因此,DBSCAN和K-means都有各自的优点和适用场景,需要根据具体问题选择合适的算法。 <h3>回答2:</h3><br/>DBSCAN(密度聚类算法)和K-Means是机器学习中常用的聚类算法。虽然它们都可以将一个数据集分成不同的簇,但两种算法对数据集中的数据点分配簇的方式有所不同。 K-Means是一种基于距离的聚类算法,它将数据点分为预定义数量的簇。该算法会在数据集中为用户定义的簇数分配一个初始的质心。然后K-Means会将每个数据点分配到离它最近的簇中,并根据已分配的数据点计算新的簇质心,重复以上步骤直到质心不再改变。 DBSCAN是另一种聚类算法,它判断每个样本点周围的密度是否足够大,如果周围密度达到一定的值,该样本将被认为是核心样本。然后将该核心样本的领域内所有样本加入该簇中,并继续递归将该簇扩大,直到没有新的样本可以加入该簇为止。 这两种聚类算法的主要区别在于,K-Means需要人为指定聚类的数量,并固定质心,而DBSCAN则可以自动地找到给定数据集中存在的聚类和噪点。 DBSCAN还能够处理不同形状和密度的集群,而K-Means需要相同大小的簇,且必须是球形。 总的来说,DBSCAN更适合处理噪点比较多的数据集,对于不必要预定义聚类数的情况下,也更加灵活。而K-Means更适合于数据点之间较为均匀分布的数据集,且聚类簇数已知或可预估的情况下,K-Means拥有更简单和更快速的计算方式。 <h3>回答3:</h3><br/>DBSCAN和K-means聚类都是常用的聚类算法。它们都是基于数据聚集基础上的相似性来进行聚类,但它们有着不同的优点和适用范围。 首先,K-means 算法是一种典型的距离聚类算法,经常被使用。该算法最主要的优点在于算法的实现很简单、易于理解,同时它的时间复杂度同样也很低,而且可适用于大规模的数据集。K-means 缺点就是它需要用户提供聚类数量,同时结果随初始值的不同可能会产生不同的聚类结果。K-means 聚类适合于欧氏空间,其聚类效果更好结果更精确。但是,当数据点的分布符合任意的形状或者不同的密度时,K-means 算法的表现就不够好。 其次,DBSCAN算法是一种基于密度聚类算法,其主要优点是可以自动识别簇数、将不同密度分布的样本聚成不同的簇,并能很好地处理噪声。但是该算法依赖于两个主要的参数,即ε、MinPoints,用户需要事先确认好这两个参数的取值。DBSCAN适合非欧氏空间各种形状的数据集,即使数据点的分布不均匀,密度不同,表现也不失优异。 最后,总的来说,K-means算法在处理欧氏空间的数据时,有着简单易用和高效的优势,特别是适合所研究问题的数据集聚类数较少的时候。而DBSCAN 算法适合在处理高维数据集或遇到更加复杂的数据时,可以极大地提高聚类的精度。这两种聚类算法选择的关键是要根据数据的特征和聚类目标进行地理解和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值