聚类算法(3):DBSCAN密度聚类
目录
1. 基本概念
2. 算法描述
3. 算法实例
4. 算法优缺点
DBSCAN(Density—Based Spatial Clustering of Application with Noise)算法是一种典型的基于密度的聚类方法,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值,它将簇定义为密度相连的点的最大集合。该方法能在具有噪声的空间数据库中发现任意形状的簇,可将密度足够大的相邻区域连接,能有效处理异常数据,主要用于对空间数据的聚类,
1. 基本概念
DBSCAN 算法中有两个重要参数:Eps 和 MmPtS。
- Eps:定义密度时的邻域半径;
- MmPts :定义核心点时的阈值,形成簇所需的最小核心点数量
在 DBSCAN 算法中将数据点分为以下 3 类。
1)核心点:稠密区域内部的点
如果一个对象在其半径 Eps 内含有超过 MmPts 数目的点,则该对象为核心点。
2)边界点:稠密区域边缘的点
如果一个对象在其半径 Eps 内含有点的数量小于 MinPts,但是该对象落在核心点的邻域内,则该对象为边界点。
3)噪音点:稀疏区域中的点
如果一个对象既不是核心点也不是边界点,则该对象为噪音点。
通俗地讲,核心点对应稠密区域内部的点,边界点对应稠密区域边缘的点,而噪音点对应稀疏区域中的点。
在图 1 中,假设 MinPts=5,Eps 如图中箭头线所示,则点 A 为核心点,点 B 为边界点,点 C 为噪音点。点 A 因为在其 Eps 邻域内含有 7 个点,超过了 Eps=5,所以是核心点。
点 E 和点 C 因为在其 Eps 邻域內含有点的个数均少于 5,所以不是核心点;点 B 因为落在了点 A 的 Eps 邻域内,所以点 B 是边界点;点 C 因为没有落在任何核心点的邻域内,所以是噪音点。
图 1 DBSCAN算法数据点类型示意
进一步来讲,DBSCAN 算法还涉及以下一些概念。
名称 | 说明 |
Eps 邻域 | 简单来讲就是与点的距离小于等于 Eps 的所有点的集合 |
直接密度可达 | 如果点 p 在核心点 q 的 Eps 邻域內,则称数据对象 p 从数据对象 q 出发是直接密度可达的。 |
密度可达 | 如果存在数据对象链 是从 关于 Eps 和 MinPts 直接密度可达的,则数据对象 是从数据对象 关于 Eps MinPts 密度可达的。 |
密度相连 | 对于对象 p 和对象 q,如果存在核心对象样本 o,使数据对象 p 和对象 q 均从 o 密度可达,则称 p 和 q 密度相连。显然,密度相连具有对称性。 |
密度聚类簇 | 由一个核心点和与其密度可达的所有对象构成一个密度聚类簇。 |
图 2 直接密度可达和密度可达示意
在图 2 中,点 a 为核心点,点 b 为边界点,并且因为 a 直接密度可达 b。但是 b 不直接密度可达 a(因为 b 不是一个核心点)。因为 c 直接密度可达 a,a 直接密度可达 b,所以 c 密度可达 b。但是因为 b 不直接密度可达 a,所以 b 不密度可达 c。但是 b 和 c 密度相连。
2. 算法描述
DBSCAN 算法对簇的定义很简单,由密度可达关系导出的最大密度相连的样本集合,即为最终聚类的一个簇。
DBSCAN 算法的簇里面可以有一个或者多个核心点。如果只有一个核心点,则簇里其他的非核心点样本都在这个核心点的 Eps 邻域里。如果有多个核心点,则簇里的任意一个核心点的 Eps 邻域中一定有一个其他的核心点,否则这两个核心点无法密度可达。这些核心点的 Eps 邻域里所有的样本的集合组成一个 DBSCAN 聚类簇。
DBSCAN算法的描述如下。
- 输入:数据集,邻域半径 Eps,邻域中数据对象数目阈值 MinPts;
- 输出:密度联通簇。
处理流程如下:
(1)从数据集中任意选取一个数据对象点 p; (从数据集中顺序扫描还未分簇的样本点p)
(2)计算出p 的 Eps 邻域,如果对于参数 Eps 和 MinPts,所选取的数据对象点 p 为核心点,则找出所有从 p 密度可达的数据对象点,形成一个簇;
(3)如果选取的数据对象点 p 是边缘点,选取另一个数据对象点;
(4)重复(2)、(3)步,直到所有点被处理。
DBSCAN 算法的计算复杂的度为 O(n²),n 为数据对象的数目。这种算法对于输入参数 Eps 和 MinPts 是敏感的。
3. 算法实例
下面给出一个样本数据集,如表 1 所示,并对其实施 DBSCAN 算法进行聚类,取 Eps=3,MinPts=3。
数据集中的样本数据在二维空间内的表示如图 3 所示:
图 3 直接密度可达和密度可达示意
第一步,顺序扫描数据集的样本点,首先取到 p1(1,2)。
1)计算 p1 的邻域,计算出每一点到 p1 的距离,如 d(p1,p2)=sqrt(1+1)=1.414。
2)根据每个样本点到 p1 的距离,计算出 p1 的 Eps 邻域为 {p1,p2,p3,p13}。
3)因为 p1 的 Eps 邻域含有 4 个点,大于 MinPts(3),所以,p1 为核心点。
4)以 p1 为核心点建立簇 C1,即找出所有从 p1 密度可达的点。
5)p1 邻域内的点都是 p1 直接密度可达的点,所以都属于C1。
6)寻找 p1 密度可达的点,p2 的邻域为 {p1,p2,p3,p4,p13},因为 p1 密度可达 p2,p2 密度可达 p4,所以 p1 密度可达 p4,因此 p4 也属于 C1。
7)p3 的邻域为 {p1,p2,p3,p4,p13},p13的邻域为 {p1,p2,p3,p4,p13},p3 和 p13 都是核心点,但是它们邻域的点都已经在 Cl 中。
8)P4 的邻域为 {p3,p4,p13},为核心点,其邻域内的所有点都已经被处理。
9)此时,以 p1 为核心点出发的那些密度可达的对象都全部处理完毕,得到簇C1,包含点 {p1,p2,p3,p13,p4}。
第二步,继续顺序扫描数据集的样本点,取到p5(5,8)。
1)计算 p5 的邻域,计算出每一点到 p5 的距离,如 d(p1,p8)-sqrt(4+1)=2.236。
2)根据每个样本点到 p5 的距离,计算出p5的Eps邻域为{p5,p6,p7,p8}。
3)因为 p5 的 Eps 邻域含有 4 个点,大于 MinPts(3),所以,p5 为核心点。
4)以 p5 为核心点建立簇 C2,即找出所有从 p5 密度可达的点,可以获得簇 C2,包含点 {p5,p6,p7,p8}。
第三步,继续顺序扫描数据集的样本点,取到 p9(9,5)。
1)计算出 p9 的 Eps 邻域为 {p9},个数小于 MinPts(3),所以 p9 不是核心点。
2)对 p9 处理结束。
第四步,继续顺序扫描数据集的样本点,取到 p10(1,12)。
1)计算出 p10 的 Eps 邻域为 {p10,pll},个数小于 MinPts(3),所以 p10 不是核心点。
2)对 p10 处理结束。
第五步,继续顺序扫描数据集的样本点,取到 p11(3,12)。
1)计算出 p11 的 Eps 邻域为 {p11,p10,p12},个数等于 MinPts(3),所以 p11 是核心点。
2)从 p12 的邻域为 {p12,p11},不是核心点。
3)以 p11 为核心点建立簇 C3,包含点 {p11,p10,p12}。
第六步,继续扫描数据的样本点,p12、p13 都已经被处理过,算法结束。
4. 算法优缺点
和传统的 k-means 算法相比,DBSCAN 算法不需要输入簇数 k 而且可以发现任意形状的聚类簇,同时,在聚类时可以找出异常点。
优点:
1)聚类速度快,可以对任意形状的稠密数据集进行聚类,而 k-means 之类的聚类算法一般只适用于凸数据集。
2)可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
3)聚类结果没有偏倚,而 k-means 之类的聚类算法的初始值对聚类结果有很大影响。
4)与K-MEANS比较起来,不需要输入要划分的聚类个数。
5)可以在需要时输入过滤噪声的参数。
缺点:
1)样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,因为这种情况下参数MinPts和Eps选取困难,这时用 DBSCAN 算法一般不适合。
2)样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的 KD 树或者球树进行规模限制来进行改进。当数据量增大时,要求较大的内存支持,I/O消耗也很大
3)调试参数比较复杂时,主要需要对距离阈值 Eps、邻域样本数阈值 MinPts 进行联合调参,不同的参数组合对最后的聚类效果有较大影响。
4)对于整个数据集只采用了一组参数。如果数据集中存在不同密度的簇或者嵌套簇,则 DBSCAN 算法不能处理。为了解决这个问题,有人提出了 OPTICS 算法。
5)DBSCAN 算法可过滤噪声点,这同时也是其缺点,这造成了其不适用于某些领域,如对网络安全领域中恶意攻击的判断。
参考:https://blog.csdn.net/zhouxianen1987/article/details/68945844
聚类算法(3):DBSCAN密度聚类相关推荐
- 机器学习-无监督学习-聚类:聚类方法(二)--- 基于密度的聚类算法【DBSCAN文本聚类算法,密度最大值文本聚类算法】
密度聚类方法的指导思想是,只要样本点的密度大于某阀值,则将该样本添加到最近的簇中. 基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一 ...
- 聚类算法系列之密度聚类DBSCAN
DBSCAN算法简述: 为什么出现DBSCAN算法? 当大家一说起聚类算法时候,最先想到的估计就是K-Means或Mean-Shift算法了.但是,K-Means和Mean-Shift算法是通过距离聚 ...
- python实现k core算法_python实现密度聚类(模板代码+sklearn代码)
本人在此就不搬运书上关于密度聚类的理论知识了,仅仅实现密度聚类的模板代码和调用skelarn的密度聚类算法. 有人好奇,为什么有sklearn库了还要自己去实现呢?其实,库的代码是比自己写的高效且容易 ...
- python机器学习库sklearn——DBSCAN密度聚类
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 DBSCAN密度聚类的相关 ...
- (3)聚类算法之DBSCAN算法
文章目录 1.引言 2.`DBSCAN`相关定义 3.`DBSCAN`密度聚类思想 3.1 `DBSCAN`算法定义 3.2 DBSCAN算法流程 4.`DBSCAN`算法实现 4.1 使用`nump ...
- 人工智能——DBSCAN密度聚类(Python)
目录 1 概述 1.1 概念 1.2 DBSCAN数据点分类 2 DBSCAN算法流程 2.1 DBSCAN算法流程: 2.2 举例 3 案例1(Python实现 ) 3.1 案例 3.2 Pytho ...
- 关于聚类算法Kmeans/K-mediods/层次聚类/OPTICS较为详细的介绍
K-means算法 将一群物理对象或者抽象对象的划分成相似的对象类的过程.其中类簇是数据对象的集合,在类簇中所有的对象都彼此相似,而类簇与类簇之间的对象是彼此相异. 聚类除了可以用于数据分割(data ...
- 张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法
pycharm使用的简单教程 层次一 Mean_shift聚类算法和其他的聚类算法 作者介绍 1. 安装包的准备: 2. Mean-shift原理及实现 2.1 Mean-shift原理 2.2 主要 ...
- 聚类算法 距离矩阵_模糊聚类算法
模糊聚类算法 1.如何理解模糊聚类 事物间的界线,有些是明确的,有些则是模糊的.当聚类涉及到事物之间的模糊界线时,需要运用模糊聚类分析方法. 如何理解模糊聚类的"模糊"呢:假设有两 ...
- K-means聚类算法和模糊C-means聚类算法
K-means聚类算法和模糊C-means聚类算法 1.K-means聚类算法 K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数, ...
最新文章
- DevOps笔记-04:DevOps工具和文化缺一不可
- Linux虚拟机NAT模式设置固定ip
- 纹理滤波(Texture Filter)
- SaltStack实战之配置管理-Jinja2模板
- vue如何在用户要关闭当前网页时弹出提示
- 海纳百川、有容乃大:从4个角度解读京东3C新方向
- 从0到1搞一波dubbo
- 打开tomcat的管理平台,管理应用
- Spring mvc @ RequestMapping
- 文献查找网站集合(自用)
- PHP的面向对象模型(转贴)
- 使用AD域管理您的本地计算机密码
- C语言 求两个数最小公倍数和最大公因数
- Cydia怎样添加威锋源
- Error launching application on iPhone 11 Pro Max.
- Java的时间类库joda教程
- java获取东八区时间
- 调研容易上岸的在职研究生
- 线上tomcat服务器假死排查
- R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值
热门文章
- 使用element ui 组件的时候,如果使用两个或多个按钮在同一个单元格内,按钮会竖着排列,但是不能够对齐怎么解决?
- element-ui中对话框dialog不显示,仅背景变灰
- 怎么样用idea上传git?-通俗易懂
- 支持app需要多大的服务器,上海app开发需要多大服务器空间?
- java创建集合有的不用泛型_为什么在Java泛型右手边的集合类型没有任何影响?...
- ML之FE:pandas库中数据分析利器之groupby分组函数、agg聚合函数、同时使用groupby与agg函数组合案例之详细攻略
- ML之LiR:使用线性回归LiR回归模型在披萨数据集上拟合(train)、价格回归预测(test)
- 成功解决ValueError: Found input variables with inconsistent numbers of samples: [86, 891]
- 成功解决 threading Exception unhandled RuntimeError
- Funny:还是程序猿会玩——弹幕炸天学AI和区块链,玩起来!弹慕君,你也值得拥有!