DBSCAN 基于密度的空间带噪聚类法

news2025/2/15 9:01:14

DBSCAN 基于密度的空间带噪聚类法

DBSCAN(Density - Based Spatial Clustering of Applications with Noise)即基于密度的空间聚类算法,它是一种典型的密度聚类算法,以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。

核心概念

  • 密度:密度是指在一个特定区域内数据点的数量。DBSCAN 算法使用一个半径参数 ϵ \epsilon ϵ来定义这个区域。在半径为的圆形区域内,数据点的数量就是该区域的密度。
  • 核心点:如果一个数据点在其邻域内包含的数据点数量大于或等于某个阈值 m i n P t s minPts minPts,则该数据点被定义为核心点。核心点是密度聚类的关键,它们代表了高密度区域的中心。
  • 边界点:边界点是指在其 ϵ \epsilon ϵ邻域内的数据点数量小于 m i n P t s minPts minPts,但该点落在某个核心点的邻域内。边界点位于高密度区域的边缘,它们依赖于核心点来确定所属的聚类。
  • 噪声点:噪声点是指既不是核心点也不是边界点的数据点。这些点通常位于低密度区域,与任何高密度聚类都没有明显的关联,被视为数据中的噪声或异常值。

优缺点

优点

  1. 能发现任意形状的簇 ,DBSCAN 基于密度连接的概念来定义聚类,因此不受限于特定的聚类形状,能够识别出具有复杂形状和不规则边界的聚类。
  2. 无需事先知道要形成的簇类的数量,DBSCAN 算法通过数据点的密度分布自动识别聚类,用户只需要设置邻域半径和最小点数这两个参数,算法就能根据数据的实际情况确定聚类的数量。
  3. 能够识别出数据集中的噪声点,DBSCAN 算法将那些既不属于任何聚类的核心点,也不落在任何核心点的邻域内的数据点标记为噪声点。这种对噪声点的识别能力使得 DBSCAN 在处理包含噪声和异常值的数据集时表现出色。

缺点

  1. 对参数敏感,DBSCAN 算法的性能高度依赖于邻域半径 ϵ \epsilon ϵ和最小点数 m i n P t s minPts minPts这两个参数的选择。不同的参数设置可能会导致完全不同的聚类结果。
  2. 计算复杂度高,对于包含个数据点的数据集,DBSCAN 算法的时间复杂度通常为 O ( n 2 ) O(n^{2}) O(n2)。这是因为在算法的执行过程中,需要对每个数据点计算其与其他所有数据点之间的距离,以确定其邻域内的数据点数量。

示例

考虑要聚类的某个空间中的一组点。假设 ε ε ε 是一个参数,指定邻域相对于某个点的半径。为了 DBSCAN 聚类的目的,这些点被分类为核心点、(直接)可达点和异常值,如下所示:

  • p p p 是一个核心点,如果至少 m i n P t s = 4 minPts=4 minPts=4个点在它的距离 ε ε ε 内(包括 p p p)。
  • 如果点 q q q 与核心点 p p p 在距离 ε ε ε 内,则点 q q q 可从 p p p 直接到达。点 q q q 只被称为可从核心点直接到达。
  • 如果有 p 1 = p p_{1}=p p1=p p n = q p_{n}=q pn=q 的路径 p 1 , … , p n p_{1},…,p_{n} p1pn,其中每个 p i + 1 p_{i+1} pi+1 都可以从 p i p_{i} pi 直接到达,则可以从 p p p 到达点 q q q。请注意,这意味着初始点和路径上的所有点必须是核心点, q q q 可能除外。
  • 从任何其他点无法到达的所有点都是异常值或噪声点。

如果 p p p 是一个核心点,那么它与所有可从它到达的点(核心或非核心)一起形成一个集群。每个集群至少包含一个核心点;非核心点可以是集群的一部分,但它们形成了集群的 “边缘”,因为它们不能用于到达更多的点。

DBSCAN
在这个图中, m i n P t s = 4 minPts=4 minPts=4。点 A A A 和其他红点是核心点,因为在 ε ε ε 半径内围绕这些点的区域至少包含 4 个点(包括点本身)。因为它们都是可以相互到达的,所以它们形成了一个集群。点 B B B C C C 不是核心点,而是可以从 A A A(通过其他核心点)到达的,因此也属于集群。点 N N N 是一个噪声点,既不是核心点,也不是直接可到达的。

算法

DBSCAN 需要两个参数: ε ( e p s ) ε(eps) ε(eps) 和形成密集区域所需的最小点数 m i n P t s minPts minPts
从一个未被访问的任意起点开始。检索该点的 ε ε ε 邻域,如果它包含足够多的点,则启动一个集群。否则,该点被标记为噪声。请注意,该点稍后可能会在另一个点的足够大的 ε ε ε 环境中找到,因此成为集群的一部分。

如果一个点被发现是集群的稠密部分,它的 ε ε ε 邻域也是该集群的一部分。因此,在 ε ε ε 邻域中找到的所有点都被添加,当它们也是稠密时,它们自己的 ε ε ε 邻域也是如此。这个过程一直持续到完全找到密度连接的集群。然后,检索并处理一个新的未访问点,从而发现另一个集群或噪声。

DBSCAN 可以与任何距离函数(以及相似度函数或其他谓词)一起使用。因此,距离函数(distFunc)可以看作是一个附加参数。

该算法可以用伪代码表示如下:

DBSCAN(DB, distFunc, eps, minPts) {
    C := 0                                                  /* Cluster counter */
    for each point P in database DB {
        if label(P) ≠ undefined then continue               /* Previously processed in inner loop */
        Neighbors N := RangeQuery(DB, distFunc, P, eps)     /* Find neighbors */
        if |N| < minPts then {                              /* Density check */
            label(P) := Noise                               /* Label as Noise */
            continue
        }
        C := C + 1                                          /* next cluster label */
        label(P) := C                                       /* Label initial point */
        SeedSet S := N \ {P}                                /* Neighbors to expand */
        for each point Q in S {                             /* Process every seed point Q */
            if label(Q) = Noise then label(Q) := C          /* Change Noise to border point */
            if label(Q) ≠ undefined then continue           /* Previously processed (e.g., border point) */
            label(Q) := C                                   /* Label neighbor */
            Neighbors N := RangeQuery(DB, distFunc, Q, eps) /* Find neighbors */
            if |N| ≥ minPts then {                          /* Density check (if Q is a core point) */
                S := S ∪ N                                  /* Add new neighbors to seed set */
            }
        }
    }
}
RangeQuery(DB, distFunc, Q, eps) {
    Neighbors N := empty list
    for each point P in database DB {                      /* Scan all points in the database */
        if distFunc(Q, P) ≤ eps then {                     /* Compute distance and check epsilon */
            N := N ∪ {P}                                   /* Add to result */
        }
    }
    return N
}

DBSCAN 算法可以抽象为以下步骤:

  1. 找到每个点的 ε ( e p s ) ε(eps) ε(eps)邻域中的点,并识别出邻域超过 m i n P t s minPts minPts 的核心点。
  2. 在邻接图上找到核心点的连通分支,忽略所有非核心点。
  3. 如果集群是 ε ( e p s ) ε(eps) ε(eps)邻居,则将每个非核心点分配给附近的集群,否则将其分配给噪声。

一个简单的实现需要在步骤 1 中存储邻域,因此需要大量内存。原始 DBSCAN 算法不需要通过一次执行一个点来执行这些步骤。

参数估计

对于 DBSCAN,需要参数 ε ε ε m i n P t s minPts minPts。参数必须由用户指定。理想情况下, ε ε ε 的值由要解决的问题给出(例如物理距离), m i n P t s minPts minPts 是所需的最小集群大小。

  • m i n P t s minPts minPts
    根据经验,最小 m i n P t s minPts minPts 可以从数据集中的维数 D D D 中得出,即 m i n P t s ≥ D + 1 minPts≥D+1 minPtsD+1 m i n P t s = 1 minPts=1 minPts=1 的低值没有意义,因为根据定义,每个点都是一个核心点。对于 m i n P t s ≤ 2 minPts≤2 minPts2,结果将与使用单个链接度量的分层聚类相同,树状图在高度 ε ε ε 处切割。因此, m i n P t s minPts minPts必须选择至少 3 个点。然而,对于有噪声的数据集,较大的值通常更好,并且会产生更显着的聚类。根据经验,可以使用 m i n P t s = 2 ・ d i m minPts=2・dim minPts=2dim,但对于非常大的数据、有噪声的数据或包含许多重复项的数据,可能有必要选择更大的值。

  • ε ε ε:可以使用 k-distance图来选择 ε ε ε 的值,绘制到 k = m i n P t s − 1 k=minPts-1 k=minPts1 最近邻的距离,从最大值到最小值排序。 ε ε ε 的好值是这个图显示 “弯头” 的地方:如果 ε ε ε 选择得太小,很大一部分数据将不会被聚类;而对于 ε ε ε的值太高,集群将合并,大多数对象将在同一个集群中。一般来说, ε ε ε 的小值更可取,根据经验,只有一小部分点应该在彼此的距离内。

  • 距离函数:
    距离函数的选择与 ε ε ε 的选择紧密耦合,对结果有重大影响。一般来说,在选择参数 ε ε ε 之前,有必要首先确定数据集的合理相似性度量。这个参数没有估计,但是需要为数据集适当地选择距离函数。

参考

  1. https://en.wikipedia.org/wiki/DBSCAN
  2. https://zhuanlan.zhihu.com/p/152453383

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基于Django的漏洞扫描系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

或非门组成的SR锁存器真值表相关问题

PS&#xff1a;主要是给大家抛砖引玉&#xff0c;不喜勿喷。 问题描述&#xff1a;或非门组成的SR锁存器&#xff0c;为什么当SD和RD等于0时候的真值表一个是Q0&#xff0c;Q0.一个结果是Q1&#xff0c;Q1&#xff1f;

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…

unity删除了安卓打包平台,unityhub 还显示已经安装,怎么解决

解决问题地址 可能由于版本问题文章中这个我没搜到&#xff0c;应该搜Android Build Supprot

C++ Primer 参数传递

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

数据结构 day06

数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历&#xff08;画图&#xff09;7.2.5. 二叉…

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…

01什么是DevOps

在日常开发中&#xff0c;运维人员主要负责跟生产环境打交道&#xff0c;开发和测试&#xff0c;不去操作生产环境的内容&#xff0c;生产环境由运维人员操作&#xff0c;这里面包含了环境的搭建、系统监控、故障的转移&#xff0c;还有软件的维护等内容。 当一个项目开发完毕&…

力扣100. 相同的树(利用分解思想解决)

Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同&#xff0c;而此要求可以利用问题分解的思想解决&#xff0c;即判断当前节点的左右子树是否完全相同&#xff0c;而在二叉树问题分解的一般题目中均会带有返回值&#xff…

el-select 设置宽度 没效果

想实现下面的效果&#xff0c;一行两个&#xff0c;充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因&#xff1a; el-form 添加了 inline 所以删除inline属性 即可

chrome://version/

浏览器输入&#xff1a; chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) &#xff08;64 位&#xff09; (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…

反向代理块sjbe

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…

P1878 舞蹈课(详解)c++

题目链接&#xff1a;P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;我们可以发现任意两个相邻的都是异性&#xff0c;所以他们的舞蹈技术差值我们都要考虑&#xff0c;4和2的差值是2&#xff0c;2和4的差值是2&#xff0c;4和3的差值是1&#xff0c;根…

【C++学习篇】C++11

目录 ​编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…

Vulnhub靶机随笔-Hackable II

Vulnhub靶机Hackable II详解 攻击机Kali IP:192.168.1.6 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令:nmap -A -p- -sV 靶机IP 3.靶机开放三个端口: 21ftp端口:存在anonymous匿…

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库已难以满足高可用性、扩展性和…

【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】

在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…