DBSCAN 聚类算法

DBSCAN 算法是一种基于密度的聚类算法,它能够发现任意形状的类别 (database 2),而 kkk-means 只能发现凸 (convex) 的形状 (database 1),同时 DBSCAN 还有很强的抗噪性 (database 3),在具有噪声的数据中发现任意形状的聚类。DBSCAN 只需扫描一遍数据集即可完成聚类,不需迭代执行。

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

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

DBSCAN 既可以适用于凸样本集,也可以适用于非凸样本集。

DBSCAN 只需扫描一遍数据库。在扫描的过程中判断当前数据 qqq 是否是核心数据点,如果是的话,那么就发现了一个新的类别,并且在添加新的数据点时将它们标记为这个类别。首先将 qqq 还没有标记类别或者标记 noise 的 Eps 近邻都添加进去。如果新添加的近邻也是核心数据点的话,就再添加其没有标记类别或者标记 noise 的 Eps 近邻,直至不能再添加新的结点。如果不是的话,就将 qqq 标记为 noise 并跳到下一个数据点。扫描之后,标记为 noise 的数据点就是噪声数据。

density-reachability and density-connectivity

mmm, ppp, ooo, rrr 都是核心对象

  1. 对象 qqq 是由 mmm 直接密度可达的。对象 mmm 由 ppp 直接密度可达的。
  2. 对象 qqq 是由 ppp (间接) 密度可达的,因为 qqq 由 mmm 直接密度可达,mmm 由 ppp 直接密度可达。
  3. rrr 和 sss 是由 ooo 密度可达的,而 ooo 是由 rrr 密度可达的。

只有核心对象才能使其他样本密度直达。注意密度可达也不满足对称性,由密度直达的不对称性得出。密度相连关系是满足对称性的。

MinPts=5,红色的点都是核心对象,因为其 Eps-邻域至少有 5 个样本。黑色的样本是非核心对象。所有核心对象密度直达的样本在以红色核心对象为中心的超球体内。如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心对象组成了密度可达的样本序列。在这些密度可达的样本序列的 Eps-邻域内所有的样本相互都是密度相连的。

DBSCAN 需从数据库中寻找到一个指定数据的 Eps 近邻,而这需要扫描全部数据库。通过 R* trees 可以优化这种区域查找。

A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise 中提出一种启发式的方法来选择最稀疏类别的参数。首先计算出所有数据点的第 kkk 个近邻与它的距离,降序排序并绘制二维图。然后选择出第一个抖动大的数据的值。

convex ['kɒnveks]:adj. 凸面的,凸圆的 n. 凸面体,凸状
  1. DBSCAN 算法需要选择一种距离度量,对于待聚类的数据集中,任意两个点之间的距离,反映了点之间的密度。DBSCAN 算法对高维数据定义密度很困难,对于二维空间中的点,可以使用 Euclidean distance 来进行度量。
  2. DBSCAN 算法需要用户输入 2 个参数:一个参数是半径 (Eps),表示以给定点 PPP 为中心的圆形邻域的范围;另一个参数是以点 PPP 为中心的邻域内最少点的数量 (MinPts)。如果满足以点 PPP 为中心、半径为 Eps 的邻域内的点的个数不少于 MinPts,则称点 PPP 为核心点。
  3. DBSCAN 聚类使用 kkk-距离的概念。kkk-距离是指:给定数据集 P=p(i);i=0,1,…nP={p(i); i=0, 1, … n}P=p(i);i=0,1,…n,对于任意点 P(i)P(i)P(i),计算点 P(i)P(i)P(i) 到集合 DDD 的子集 S=p(1),p(2),…,p(i−1),p(i+1),…,p(n)S={p(1), p(2), …, p(i-1), p(i+1), …, p(n)}S=p(1),p(2),…,p(i−1),p(i+1),…,p(n) 中所有点之间的距离,距离按照从小到大的顺序排序。假设排序后的距离集合为 D=d(1),d(2),…,d(k−1),d(k),d(k+1),…,d(n)D={d(1), d(2), …, d(k-1), d(k), d(k+1), …,d(n)}D=d(1),d(2),…,d(k−1),d(k),d(k+1),…,d(n),则 d(k)d(k)d(k) 就被称为 kkk-距离。kkk-距离是点 p(i)p(i)p(i) 到所有点 (除了 p(i)p(i)p(i) 点) 之间距离第 kkk 近的距离。对待聚类集合中每个点 p(i)p(i)p(i) 都计算 kkk-距离,最后得到所有点的 k-距离集合 E=e(1),e(2),…,e(n)E={e(1), e(2), …, e(n)}E=e(1),e(2),…,e(n)。
  4. 根据经验计算半径 Eps:根据得到的所有点的 kkk-距离集合 EEE,对集合 EEE 进行升序排序后得到 kkk-距离集合 E’E’E’,需要拟合一条排序后的 E’E’E’ 集合中 kkk-距离的变化曲线图,然后绘出曲线,通过观察,将急剧发生变化的位置所对应的 kkk-距离的值,确定为半径 Eps 的值。
  5. 根据经验计算最少点的数量 MinPts:确定 MinPts 的大小,实际上也是确定 kkk-距离中 kkk 的值,DBSCAN 算法取 k=4k=4k=4,则 MinPts=4MinPts=4MinPts=4。
    如果觉得经验值聚类的结果不满意,可以适当调整 Eps 和 MinPts 的值,经过多次迭代计算对比,选择最合适的参数值。
    如果 MinPts 不变,Eps 取得值过大,会导致大多数点都聚到同一个 cluster 中,Eps 过小,会导致一个 cluster 的分裂;如果 Eps 不变,MinPts 的值取得过大,会导致同一个 cluster 中点被标记为离群点,MinPts 过小,会导致发现大量的核心点。

DBSCAN 聚类由密度可达关系导出的最大密度相连的样本集合,形成最终聚类的一个类别或簇。

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

DBSCAN 使用的方法很简单,它任意选择一个没有类别的核心对象作为种子,然后找到所有这个核心对象能够密度可达的样本集合,即为一个聚类簇。接着继续选择另一个没有类别的核心对象去寻找密度可达的样本集合,这样就得到另一个聚类簇。一直运行到所有核心对象都有类别为止。

  1. 一些异常样本点或者说少量游离于簇外的样本点,这些点不在任何一个核心对象周围,在 DBSCAN 中,我们一般将这些样本点标记为噪声点。
  2. 在 DBSCAN 中,一般采用最近邻思想,采用某一种距离度量来衡量样本距离,例如欧式距离。这和 KNN 分类算法的最近邻思想完全相同。对应少量的样本,寻找最近邻可以直接去计算所有样本的距离。如果样本量较大,则一般采用 kd_tree 或者 ball_tree 来快速的搜索最近邻。最近邻的思想参考 KNN。
  3. 某些样本可能到两个核心对象的距离都小于 Eps,但是这两个核心对象由于不是密度直达,不属于同一个聚类簇。一般来说,此时 DBSCAN 采用先来后到,先进行聚类的类别簇会标记这个样本为它的类别。DBSCAN 的算法不是完全稳定的算法。

DBSCAN 算法,需要输入 2 个参数,这两个参数的计算都来自经验知识。可以理解为以某个样本点为中心,以 Eps 为半径的球形范围内都是邻域范围。
能够有效处理噪声点和发现任意形状的空间聚类。直接对整个数据库进行操作且进行聚类时使用了一个全局性的表征密度的参数,具有比较明显的弱点。

  1. 当数据量增大时,要求较大的内存支持,I/O 消耗也很大。
  2. 当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。
  3. 参数敏感。聚类结果与用户输入的邻域半径及密度域值密切相关,可能由于用户对数据特点不了解而输入不合适的参数,进而得出不准确的结论。
  4. 算法过滤噪声点,同时也是其缺点,造成了其不适用于某些领域 (例如网络安全领域中恶意攻击的判断)。

DBSCAN 不需要输入类别数 kkk,可以发现任意形状的聚类簇。在聚类的同时可以找出异常点,和 BIRCH (balanced iterative reducing and clustering using hierarchies,利用层次方法的平衡迭代规约和聚类) 算法类似。KKK-means 一般适用于凸的样本集聚类。一般来说,如果数据集是稠密的,并且数据集不是凸的,使用 DBSCAN 会比 KKK-means 聚类效果好。

DBSCAN 主要优点:

(1) 可以对任意形状的稠密数据集进行聚类,KKK-means 聚类算法一般只适用于凸数据集。

(2) 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。

(3) 聚类结果没有偏倚。KKK-means 聚类算法初始值对聚类结果有很大影响。

DBSCAN 主要缺点:

(1) 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,DBSCAN 聚类一般不适合。

(2) 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的 kd_tree 或者 ball_tree 进行规模限制来改进。

(3) 调参相对于传统的 KKK-means 聚类算法稍复杂,主要需要对距离阈值 Eps,邻域样本数阈值 MinPts 联合调参,不同的参数组合对最后的聚类效果有较大影响。

凸优化 / 凸最优化 / 凸最小化的文献里面会包含凸集的概念。

References

SCAN: A Structural Clustering Algorithm for Networks
A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise

DBSCAN 聚类算法相关推荐

  1. dbscan算法c语言实现,用C++实现DBSCAN聚类算法

    这几天由于工作需要,对DBSCAN聚类算法进行了C++的实现.时间复杂度O(n^2),主要花在算每个点领域内的点上.算法很简单,现共享大家参考,也希望有更多交流. 数据点类型描述如下: 复制代码 代码 ...

  2. dbscan聚类算法_一种视频人群流的轨迹聚类方法

    tags: KLT光流法,K-means聚类算法,DBSCAN聚类算法 方法简介 运动轨迹是一种在视频场景中捕捉复杂时间动态的有效方法.因此,我们将人流分割问题转化为一个轨迹提取和聚类任务.该方法分为 ...

  3. DBSCAN聚类算法原理及图解

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...

  4. K-means与DBSCAN聚类算法

    K-means与DBSCAN聚类算法 前言:目前数据聚类方法大体上可以分为划分式聚类方法(Partition-based Methods).基于密度的聚类方法(Density-based method ...

  5. PCL 点云DBSCAN聚类算法

    文章目录 一.简介 二.实现代码 三.实现效果 参考资料 一.简介 关于DBSCAN聚类算法的原理可以看之前的文章:点云DBSCAN聚类算法(C++),这里仅仅是对该算法进行了整理,让它可以支持PCL ...

  6. python:实现DBSCAN聚类算法(附完整源码)

    python:实现DBSCAN聚类算法 print(__doc__)# 引入相关包import numpy as npfrom sklearn.cluster import DBSCANfrom sk ...

  7. 毫米波雷达点云 DBSCAN聚类算法

    毫米雷达点云 DBSCAN聚类算法 聚类的目的 聚类算法分类 原型聚类 层次聚类 密度聚类 DBSCAN聚类算法原理 相关定义 算法流程以及伪代码 DBSCAN算法优缺点 DBSCAN参数选择 聚类衡 ...

  8. dbscan算法_如何掌握用于机器学习的流行DBSCAN聚类算法

    总览 DBSCAN聚类是一种针对无监督学习问题而被低估但非常有用的聚类算法 了解DBSCAN集群如何工作,为什么要学习以及如何在Python中实现DBSCAN集群 介绍 掌握无监督学习为数据科学家开辟 ...

  9. python DBSCAN聚类算法

    文章目录 DBSCAN聚类算法 基本思想 基本概念 工作流程 参数选择 DBSCAN的优劣势 代码分析 ==Matplotlib Pyplot== ==make_blobs== ==StandardS ...

  10. DBSCAN聚类算法——机器学习(理论+图解+python代码)

    一.前言 二.DBSCAN聚类算法 三.参数选择 四.DBSCAN算法迭代可视化展示 五.常用的评估方法:轮廓系数 六.用Python实现DBSCAN聚类算法 一.前言 去年学聚类算法的R语言的时候, ...

最新文章

  1. sklearn SVM(支持向量机)模型使用RandomSearchCV获取最优参数及可视化​​​​​​​
  2. 20155216 Exp6 信息搜集与漏洞扫描
  3. js排序的时间复杂度_js 排序算法之快速排序
  4. OpenXR+Runtime:OpenXR SDK Source Code源码编译
  5. 简单解决网课或教育平台在线学习视频鼠标检测问题
  6. 开源和非开源IM即时通讯源码有什么区别,哪个更好
  7. unity 实验演示 教程_Unity的演示团队– Unity最出色的视觉效果背后的创造者
  8. 使用NDK编译C++代码
  9. matlab分组形式条形图,Matplotlib带标签的分组条形图
  10. mysql求回购率_SQL-- 用户行为(复购率、回购率等)
  11. Mac系统随笔 | (1)Mac系统中的PageUp、PageDown、Home和End
  12. 人工智能中的术语及缩略语
  13. org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.cy.pj.goods.dao
  14. 翻翻git之---溜的飞起的加载效果AVLoadingIndicatorView
  15. 一般玫瑰线-matlab绘制
  16. PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化
  17. 云展网教程 | 微信杂志分享公众号以及订阅号方法
  18. Excel:SUMPRODUCT函数
  19. 个人整理的UI设计部分知识点(AI和PS)
  20. 「构建企业级推荐系统系列」深度学习在推荐系统中的应用

热门文章

  1. 数据可视化之地图可视化
  2. 数控编程加工中心注意事项有哪些,你知道吗
  3. 虚拟仿真实验教学计算机网络,虚拟仿真实验教学及实验中心建设
  4. 手游无限多开器安卓版_万能多开助手app下载-万能多开助手 安卓版v3.8.2-PC6安卓网...
  5. 卡尔曼滤波器工作原理
  6. JS实现逆波兰表达式
  7. Python教你实现微信防撤回~
  8. hprose for php,基于swoole的Hprose for PHP 开发后端API服务 实践
  9. idea更换源_IDEA修改Maven替换阿里源
  10. 读书笔记-人月神话13