密度聚类DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法) 是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。

一. 密度聚类原理

DBSCAN是一种基于密度的聚类算法,这类密度聚类算法一般假定类别可以通过样本分布的紧密程度决定。同一类别的样本,他们之间的紧密相连的,也就是说,在该类别任意样本周围不远处一定有同类别的样本存在。
  通过将紧密相连的样本划为一类,这样就得到了一个聚类类别。通过将所有各组紧密相连的样本划为各个不同的类别,则我们就得到了最终的所有聚类类别结果。

二. DBSCAN密度定义

DBSCAN是基于一组邻域来描述样本集的紧密程度的,参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。其中,ϵ 描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

假设我的样本集是D=(x1,x2,…,xm)
,则DBSCAN具体的密度描述定义如下:
1) ϵ-邻域:
对于xj∈D,其ϵ-邻域包含样本集D中与xj的距离不大于ϵ的子样本集,即Nϵ(xj)={xi∈D|distance(xi,xj)≤ϵ}, 这个子样本集的个数记为 |Nϵ(xj)|
2) 核心对象:
对于任一样本xj∈D,如果其ϵ-邻域对应的Nϵ(xj)至少包含MinPts个样本,即如果 |Nϵ(xj)|≥MinPts,则xj是核心对象。

样本的ϵ-邻域中的点大于等于MinPts的样本

3)密度直达:
如果xi位于xjϵ-邻域中,且xj是核心对象,则称xixj密度直达。注意反之不一定成立,即此时不能说xjxi密度直达, 除非且xi也是核心对象。

核心对象由任意一个在同一个核心对象的ϵ-邻域中的点直达

4)密度可达:
对于xixj,如果存在样本样本序列p1,p2,…,pT,满足p1=xi,pT=xj, 且pt+1pt密度直达,则称xjxi密度可达。也就是说,密度可达满足传递性。此时序列中的传递样本p1,p2,…,pT−1均为核心对象,因为只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,这个可以由密度直达的不对称性得出。

在同一个核心对象的ϵ-邻域中的点之间均由核心对象相互密度可达。

5)密度相连:
对于xixj,如果存在核心对象样本xk,使xixj均由xk密度可达,则称xixj密度相连。注意密度相连关系是满足对称性的。

示例1:

其中当minPts=3时,虚线圈表示ε邻域,则从图中我们可以观察到:
x1是核心对象;
x2由x1密度直达;
x3由x1密度可达;
x3与x4密度相连。

示例2:
从下图可以很容易看出理解上述定义,图中MinPts=5,红色的点都是核心对象,因为其ϵ-邻域至少有5个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ-邻域内所有的样本相互都是密度相连的。

三、DBSCAN密度聚类思想

DBSCAN的聚类定义很简单:由密度可达关系导出的最大密度相连的样本集合,即为我们最终聚类的一个类别,或者说一个簇。

这个DBSCAN的簇里面可以有一个或者多个核心对象。如果只有一个核心对象,则簇里其他的非核心对象样本都在这个核心对象的ϵ-邻域里;如果有多个核心对象,则簇里的任意一个核心对象的ϵ-邻域中一定有一个其他的核心对象,否则这两个核心对象无法密度可达。这些核心对象的ϵ-邻域里所有的样本的集合组成的一个DBSCAN聚类簇。

那么怎么才能找到这样的簇样本集合呢?DBSCAN使用的方法很简单,一开始任意选择一个没有被标记的核心对象,找到它的所有密度可达对象,即一个簇,这些核心对象以及它们ε邻域内的点被标记为同一个类;然后再找一个未标记过的核心对象,重复上边的步骤,直到所有核心对象都被标记为止。

基本上这就是DBSCAN算法的主要内容了,是不是很简单?但是我们还是有三个问题没有考虑。
第一个是一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象在周围,在DBSCAN中,我们一般将这些样本点标记为噪音点。

第二个是距离的度量问题,即如何计算某样本和核心对象样本的距离。在DBSCAN中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,比如欧式距离。这和KNN分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离,如果样本量较大,则一般采用KD树或者球树来快速的搜索最近邻。

第三种问题比较特殊,某些样本可能到两个核心对象的距离都小于ϵ,但是这两个核心对象由于不是密度直达,又不属于同一个聚类簇,那么如果界定这个样本的类别呢?一般来说,此时DBSCAN采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。也就是说DBSCAN的算法不是完全稳定的算法。

四、算法步骤:

五、优缺点

之前我们学过了kmeans算法,用户需要给出聚类的个数k,然而我们往往对k的大小无法确定。DBSCAN算法最大的优势就是无需给定聚类个数k,且能够发现任意形状的聚类,且在聚类过程中能自动识别出离群点。那么,我们在什么时候使用DBSCAN算法来聚类呢?一般来说,如果数据集比较稠密且形状非凸,用密度聚类的方法效果要好一些。

DBSCAN算法优点:

不需要事先指定聚类个数,且可以发现任意形状的聚类;
对异常点不敏感,在聚类过程中能自动识别出异常点;
聚类结果不依赖于节点的遍历顺序;

DBSCAN缺点:

对于密度不均匀,聚类间分布差异大的数据集,聚类质量变差;
样本集较大时,算法收敛时间较长;
调参较复杂,要同时考虑两个参数;

原始算法中所有被邻域包含在内的点都是被访问过的点,包括基点(邻域中心点),优化后只有算过邻域的点即基点才算是被访问过的点

参考
https://www.biaodianfu.com/dbscan.html
https://www.cnblogs.com/PJQOOO/p/11838288.html
https://www.cnblogs.com/pinard/p/6208966.html

(十八)密度聚类DBSCAN相关推荐

  1. 机器学习知识点(十八)密度聚类DBSCAN算法Java实现

    为更好理解聚类算法,从网上找现成代码来理解,发现了一个Java自身的ML库,链接:http://java-ml.sourceforge.net/ 有兴趣可以下载来看看源码,理解基础ML算法.对于DBS ...

  2. 【Python-ML】SKlearn库密度聚类DBSCAN模型

    # -*- coding: utf-8 -*- ''' Created on 2018年1月25日 @author: Jason.F @summary: 无监督聚类学习-基于密度 空间的聚类算法(De ...

  3. Python基于聚类算法实现密度聚类(DBSCAN)计算

    本文实例讲述了Python基于聚类算法实现密度聚类(DBSCAN)计算.分享给大家供大家参考,具体如下: 算法思想 基于密度的聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚 ...

  4. dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)

    # 密度聚类DBSCAN.HDBSCAN DBSCAN DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声 ...

  5. 密度聚类 DBSCAN python实现

    python代码例子参考另一篇博客: https://blog.csdn.net/jacke121/article/details/117736855 一.前言 二.DBSCAN聚类算法 三.参数选择 ...

  6. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解

    注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...

  7. 聚类分析:原型K-Means/K-Means++聚类、层次聚类;密度聚类DBSCAN

    聚类分析–处理无标签数据 from IPython.display import Image %matplotlib inline 1.使用K-Means方法按照相似度对对象进行分组 1.1使用skl ...

  8. 机器学习强基计划7-5:图文详解密度聚类DBSCAN算法(附Python实现)

    目录 0 写在前面 1 密度聚类 2 DBSCAN算法 3 Python实现 3.1 算法复现 3.2 可视化实验 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用.&qu ...

  9. 【机器学习】使用scikitLearn对数据进行聚类:Kmeans聚类算法的应用及密度聚类DBSCAN

    无监督学习: [机器学习]使用scikitLearn对数据进行聚类:Kmeans聚类算法及聚类效果评估 [机器学习]使用scikitLearn对数据进行聚类:高斯聚类GaussianMixture [ ...

最新文章

  1. 如何理解*(int *)0x12ff7c = 0x100;?
  2. 35岁的程序员正在消失?No,我认识了一个50岁的程序员!
  3. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
  4. 比较好的php源码,目前市面上能拿到的最好的PHP跑F分源码下载
  5. 详述 IntelliJ IDEA 插件的安装及使用方法
  6. guava的正确引入方式_使用Guava的AbstractInvocationHandler正确完成代理
  7. Linux和Windows互传文件可视化工具lrzsz的安装和使用
  8. php 有子目录,php列出目录中所有子目录的实现代码
  9. 如何管理QQ浏览器的扩展工具 QQ浏览器扩展工具的管理方法
  10. 依赖注入[5]: 创建一个简易版的DI框架[下篇]
  11. 最近和一个35岁的朋友聊天,他最近在找工作
  12. 【Spring-AOP】底层类ProxyConfig,ProxyProcessorSupport分析
  13. Pdf2cad v12(顶级pdf转cad软件)官方正式版V12.2020.12 | pdf转cad软件中文版下载 | 比pdf2cadv9更强
  14. 简单用电脑摄像头实现人脸识别
  15. centos7搭建apache服务器
  16. F - Firetrucks Are Red
  17. 电子内窥镜的研究现状及发展趋势
  18. 图像_camera_基础知识_YUV色彩模型与RGB色彩模型详解
  19. mysql 删库跑路_如何避免删库跑路呢?mysql使用bin
  20. “差不多先生”引发的悲剧

热门文章

  1. [高光谱] (6w字巨详细) GitHub开源项目Hyperspectral-Classification的解析
  2. [再学Python] - 7 - 文件
  3. python应用系列教程——python使用scapy监听网络数据包、按TCP/IP协议进行解析
  4. jQuery Mobile中单选按钮radio的data-*选项
  5. windows安装pip包
  6. 调整Word中英文与汉字之间的空隙
  7. zynq开发系列2:GPIO连接MIO控制LED闪烁
  8. Java学习笔记-12.传递和返回对象
  9. 如何理解 RxJS?RxJS的中文API和使用教程
  10. JAVA设计模式之【职责链模式】