DBSCAN 基于密度的空间带噪聚类法
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,但该点落在某个核心点的邻域内。边界点位于高密度区域的边缘,它们依赖于核心点来确定所属的聚类。
- 噪声点:噪声点是指既不是核心点也不是边界点的数据点。这些点通常位于低密度区域,与任何高密度聚类都没有明显的关联,被视为数据中的噪声或异常值。
优缺点
优点
- 能发现任意形状的簇 ,DBSCAN 基于密度连接的概念来定义聚类,因此不受限于特定的聚类形状,能够识别出具有复杂形状和不规则边界的聚类。
- 无需事先知道要形成的簇类的数量,DBSCAN 算法通过数据点的密度分布自动识别聚类,用户只需要设置邻域半径和最小点数这两个参数,算法就能根据数据的实际情况确定聚类的数量。
- 能够识别出数据集中的噪声点,DBSCAN 算法将那些既不属于任何聚类的核心点,也不落在任何核心点的邻域内的数据点标记为噪声点。这种对噪声点的识别能力使得 DBSCAN 在处理包含噪声和异常值的数据集时表现出色。
缺点
- 对参数敏感,DBSCAN 算法的性能高度依赖于邻域半径 ϵ \epsilon ϵ和最小点数 m i n P t s minPts minPts这两个参数的选择。不同的参数设置可能会导致完全不同的聚类结果。
- 计算复杂度高,对于包含个数据点的数据集,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} p1,…,pn,其中每个 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 是一个核心点,那么它与所有可从它到达的点(核心或非核心)一起形成一个集群。每个集群至少包含一个核心点;非核心点可以是集群的一部分,但它们形成了集群的 “边缘”,因为它们不能用于到达更多的点。

在这个图中, 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 listfor 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 算法可以抽象为以下步骤:
- 找到每个点的 ε ( e p s ) ε(eps) ε(eps)邻域中的点,并识别出邻域超过 m i n P t s minPts minPts 的核心点。
- 在邻接图上找到核心点的连通分支,忽略所有非核心点。
- 如果集群是 ε ( 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 minPts≥D+1。 m i n P t s = 1 minPts=1 minPts=1 的低值没有意义,因为根据定义,每个点都是一个核心点。对于 m i n P t s ≤ 2 minPts≤2 minPts≤2,结果将与使用单个链接度量的分层聚类相同,树状图在高度 ε ε ε 处切割。因此, m i n P t s minPts minPts必须选择至少 3 个点。然而,对于有噪声的数据集,较大的值通常更好,并且会产生更显着的聚类。根据经验,可以使用 m i n P t s = 2 ・ d i m minPts=2・dim minPts=2・dim,但对于非常大的数据、有噪声的数据或包含许多重复项的数据,可能有必要选择更大的值。 -
ε ε ε:可以使用
k-distance图来选择 ε ε ε 的值,绘制到 k = m i n P t s − 1 k=minPts-1 k=minPts−1 最近邻的距离,从最大值到最小值排序。 ε ε ε 的好值是这个图显示 “弯头” 的地方:如果 ε ε ε 选择得太小,很大一部分数据将不会被聚类;而对于 ε ε ε的值太高,集群将合并,大多数对象将在同一个集群中。一般来说, ε ε ε 的小值更可取,根据经验,只有一小部分点应该在彼此的距离内。 -
距离函数:
距离函数的选择与 ε ε ε 的选择紧密耦合,对结果有重大影响。一般来说,在选择参数 ε ε ε 之前,有必要首先确定数据集的合理相似性度量。这个参数没有估计,但是需要为数据集适当地选择距离函数。
参考
- https://en.wikipedia.org/wiki/DBSCAN
- https://zhuanlan.zhihu.com/p/152453383
相关文章:
DBSCAN 基于密度的空间带噪聚类法
DBSCAN 基于密度的空间带噪聚类法 DBSCAN(Density - Based Spatial Clustering of Applications with Noise)即基于密度的空间聚类算法,它是一种典型的密度聚类算法,以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。…...
Spring Security,servlet filter,和白名单之间的关系
首先,Servlet Filter是Java Web应用中的基础组件,用于拦截请求和响应,进行预处理和后处理。它们在处理HTTP请求时处于最外层,可以执行日志记录、身份验证、授权等操作。白名单机制通常指允许特定IP、用户或请求通过的安全策略&…...
深入理解Java反射机制 —— 构建灵活、动态的后端应用
一、引言 在Java后端开发中,反射机制是一项极具威力的技术。它允许程序在运行时动态加载类、调用方法以及访问属性,从而使得代码具有更高的灵活性和扩展性。本文将从反射的基本原理、核心API、实际应用场景到使用时的注意事项,详细探讨如何在…...
Python基于Django的漏洞扫描系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
或非门组成的SR锁存器真值表相关问题
PS:主要是给大家抛砖引玉,不喜勿喷。 问题描述:或非门组成的SR锁存器,为什么当SD和RD等于0时候的真值表一个是Q0,Q0.一个结果是Q1,Q1?...
深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决
在深度学习框架中,TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow(点击查看) 和 PyTorch(点击查看)。它们引领着 AI 开发的潮流,吸引着无数开发者投身其中。但这两大框…...
如何测试和验证CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析
CVE-2024-1430 是一个影响 Netgear R7000 路由器的安全漏洞,漏洞来源于该路由器 Web 管理界面的信息泄露问题。攻击者通过访问 /currentsetting.htm 文件,可能泄露敏感信息,如 Wi-Fi 密码等。 在测试和验证 CVE-2024-1430 时,您需…...
MongoDB 基本操作
一、数据库操作 1. 切换或创建数据库 使用use命令切换到指定数据库,若该数据库不存在,在首次插入数据时会自动创建。 use myDatabase 2. 查看所有数据库 使用show dbs命令查看 MongoDB 实例中的所有数据库。 show dbs 3. 删除当前数据库 使用db.…...
【前端框架】Vue3 面试题深度解析
本文详细讲解了VUE3相关的面试题,从基础到进阶到高级,分别都有涉及,希望对你有所帮助! 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化? 答案: 响应式系统:Vue2 使用 Object.definePrope…...
springboot中使用log4j2
安装依赖pom.xml <!--排除logback的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</…...
GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理
1.论文原名:Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期:2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中,许多节点的连接度较低(即…...
DeepSeek崛起:中国AI产业的颠覆者与重构者
当DeepSeek以"中国版ChatGPT"的标签横空出世时,这个诞生于杭州的AI新贵仅用三个月时间就完成了从行业黑马到颠覆者的蜕变。其开源大模型DeepSeek-R1在HuggingFace开源大模型排行榜的登顶,不仅意味着技术指标的超越,更预示着中国AI产…...
E. Exposition
题目链接:Problem - E - Codeforces 题目大意: 给你一个长度为n的序列,和一个整数k.现让找出所有连续的最长子区间, 其子区间的条件是:在区间里最大值减去最小值之差要小于 k . 输入: 输入数据的第一行包…...
KVM虚拟化快速入门,最佳的开源可商用虚拟化平台
引言 在信息技术飞速发展的时代,服务器资源的高效利用成为企业关注的焦点。KVM 虚拟化作为一种先进的虚拟化技术,在众多虚拟化方案中脱颖而出,为企业实现服务器资源的优化配置提供了有效途径。 以往,物理服务器的资源利用效率较…...
unity删除了安卓打包平台,unityhub 还显示已经安装,怎么解决
解决问题地址 可能由于版本问题文章中这个我没搜到,应该搜Android Build Supprot...
软件工程-软件设计
包括 从管理的观点看包括: 详细设计 概要设计 从技术的观点看包括: 数据设计(详细设计) 系统结构设计(概要设计) 过程设计(详细设计) 任务 分析模型——》设计模型——》设…...
【Viper】配置格式与支持的数据源与go案例
Viper 是一个用于 Go 应用程序的配置管理库,支持多种配置格式和数据源。 安装依赖 go get github.com/spf13/viper go get github.com/spf13/viper/remote go get go.etcd.io/etcd/client/v3"github.com/spf13/viper/remote"要写在etcd客户端import里 1…...
C++ Primer 参数传递
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
数据结构 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. 二叉树的遍历(画图)7.2.5. 二叉…...
AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI
前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…...
01什么是DevOps
在日常开发中,运维人员主要负责跟生产环境打交道,开发和测试,不去操作生产环境的内容,生产环境由运维人员操作,这里面包含了环境的搭建、系统监控、故障的转移,还有软件的维护等内容。 当一个项目开发完毕&…...
力扣100. 相同的树(利用分解思想解决)
Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同,而此要求可以利用问题分解的思想解决,即判断当前节点的左右子树是否完全相同,而在二叉树问题分解的一般题目中均会带有返回值ÿ…...
【深度学习模型分类】
深度学习模型种类繁多,涵盖了从基础到前沿的多种架构。以下是主要模型的分类及代表性方法: 1. 基础模型 1.1 多层感知机(MLP) 特点:全连接神经网络,适用于结构化数据。 应用:分类、回归任务…...
el-select 设置宽度 没效果
想实现下面的效果,一行两个,充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因: el-form 添加了 inline 所以删除inline属性 即可...
chrome://version/
浏览器输入: chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) (64 位) (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...
反向代理块sjbe
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
封装一个sqlite3动态库
作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
力扣第一题 哈希解法 O(n)时间复杂度
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那俩个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
【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 左值引⽤…...
