聚类算法之DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

DBSCAN是在1990年代后期推出的一种聚类方法,它迅速成为基于密度的聚类技术中最受欢迎和广泛使用的算法之一。与传统的聚类方法如K-means不同,DBSCAN的主要优势在于其能够识别出任意形状的聚类,并有效地处理噪声。在机器学习和数据分析领域,该算法常被用于其高鲁棒性和对形状的不受限制的处理能力。

DALL·E 2023-11-22 14.26.49 - Illustration of a DBSCAN clustering algorithm visualization in a 6x5 format with a uniform background. This wide image should display a scatter plot w

1. 算法解读:

DBSCAN是一种基于密度的聚类方法,其基本思想是:在一个特定的半径内有足够多的点,则这些点构成一个“密集”区域。根据这一思想,DBSCAN将数据点分类为核心点、边界点和噪声点。这些基本概念的解释如下:

核心点:在其半径ε内,存在超过 MinPts 数量的其他点,那么这个点被称为核心点。这意味着核心点周围有足够多的邻居,构成了一个“密集”区域。

边界点:在其半径ε内有少于MinPts数量的邻居点,但是它离某个核心点足够近,可以被归入某个聚类。

噪声点:既不是核心点,也不是边界点被认为是噪声点,它们不属于任何聚类。

MinPts:MinPts是一个用户定义的参数,表示一个点的邻域中最小的数据点数量,用于判断该点是否为核心点。如果一个点的半径ε内的邻居点数量不少于MinPts,那么这个点被认为是核心点,反之则不是。

DBSCAN首先任意选择一个点,并检查其邻居点的数量。如果该点是一个核心点,一个新的聚类将开始。否则,该点被标记为噪声。然后,DBSCAN会继续探索这个核心点的邻居,并将它们添加到同一个聚类中。这个过程递归地继续,直到聚类完成。

2. 步骤和细节:

1.初始化:

将所有数据点标记为未处理。

2.选择一个随机点:

随机选择一个未被标记处理的点。

3.寻找近邻:

计算该点在半径 ε 内的所有邻居点。

这些邻居点是基于用户定义的距离度量(例如欧几里得距离)和半径 ε 确定的。

4.检查核心点与创建聚类:

如果该点的邻居数量不少于 MinPts,那么该点被标记为核心点。

为该核心点创建一个新的聚类,并将其和它的邻居点加入这个聚类。

如果该点的邻居数量少于 MinPts,那么先暂时将其标记为噪声点。

5.扩展聚类:

对于新聚类中的每一个核心点,查找其在半径 ε 内的所有邻居。

对于每个邻居点,如果它是未处理的,将其标记为已处理,并加入当前聚类。如果这个邻居点有不少于 MinPts 的邻居,那么它也是一个核心点,需要继续查找其邻居。

重复上述过程,直到当前聚类中所有核心点的邻居都被考虑过。

6.重复:

返回到步骤2,选择下一个未处理的点。

重复步骤3-5,直到所有的点都已被处理。

7.最终结果:

所有没有被归入任何聚类的噪声点,保持为噪声点。

输出所有找到的聚类。

3. 举例:

想象一下,你在一个大型公园里,有很多人在聚会。我们想要找出哪些人是一起聚会的,哪些人是孤独的,不属于任何聚会。

初始化:开始时,我们看到的每个人都是单独的,没有归入任何聚会。

选择一个人:我们随机走到一个人旁边,观察他周围是否有其他人。

寻找近邻:我们查看这个人周围一定距离(例如3米)内是否有其他人。这个距离就像是DBSCAN中的半径ε。

检查核心点与创建聚会

如果这个人周围有不少于MinPts(例如3个)的人,我们就认为他们是在一起聚会的,这个人就像是核心点。我们将这个人和他周围的人标记为一个聚会组。如果周围人数少于3个,我们先暂时认为这个人是孤独的,不属于任何聚会。

扩展聚会

接下来,我们继续观察刚刚找到的聚会组中的每个人,查看他们周围是否还有其他人。如果有,我们就将这些人也归入这个聚会组,如果其中有人周围也有3个及以上的人,我们还需要继续观察他们周围的人。这个过程一直持续,直到我们找不到更多属于这个聚会组的人。

换句话说,对于这些人的每一个邻居,无论其周围是否有3个以上的人,都会被加入到聚会组中。但是,如果某个邻居B的周围确实有3个以上的人,我们就需要继续观察B的邻居,看是否有更多的人可以加入到聚会组中,因为B作为一个“聚会的中心”有可能将更多的人聚集在一起。

重复

我们再随机找一个还没有归入任何聚会组的人,重复上述过程。

这样不断重复,直到公园里的每个人都被我们观察过。

最终结果

最后,我们就能找出公园里所有的聚会组,以及那些孤独的人。

这个类比中,人就像是数据点,聚会组就像是聚类,孤独的人就像是噪声点。希望这个生活中的例子能帮助你更直观地理解DBSCAN的工作原理。

代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn.datasets import make_blobs

# 设置随机种子以保证结果的可重复性
np.random.seed(0)

# 创建三个聚会组的数据点
cluster_1 = np.random.normal(loc=5, scale=1, size=(15, 2))  # 聚会组1
cluster_2 = np.random.normal(loc=15, scale=1, size=(15, 2))  # 聚会组2
cluster_3 = np.random.normal(loc=25, scale=1, size=(15, 2))  # 聚会组3

# 创建一些孤立的点
noise = np.array([[2, 3], [3, 18], [17, 4], [22, 15]])

# 将所有点合并成一个数据集
data = np.vstack([cluster_1, cluster_2, cluster_3, noise])

# 可视化原始数据点
plt.scatter(data[:, 0], data[:, 1], c='black', label='People')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.title('People in the Park')
plt.legend()
plt.show()

# 设置DBSCAN算法的参数
epsilon = 3  # 半径ε
min_samples = 3  # MinPts

# 应用DBSCAN算法
dbscan = DBSCAN(eps=epsilon, min_samples=min_samples)
dbscan.fit(data)

# 获取聚类结果
labels = dbscan.labels_

# 可视化聚类结果
plt.scatter(data[labels == -1][:, 0], data[labels == -1][:, 1], c='black', label='Noise')
for i in range(max(labels) + 1):
    plt.scatter(data[labels == i][:, 0], data[labels == i][:, 1], label=f'Cluster {i + 1}')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.title('DBSCAN Clustering')
plt.legend()
plt.show()

# 返回聚类标签
labels

代码结果:

pp

在这个模拟实例中,我们生成了三个聚会组(Cluster 1, Cluster 2, Cluster 3)以及一些孤立的点(标记为Noise)。你可以在第一张图中看到这些原始的“人群”分布,其中每个点代表一个人。

接着,我们使用DBSCAN算法进行聚类。设置的参数为:半径 ε=3,MinPts(最小邻居点数)为 3。通过这个设置,算法成功地将三个聚会组识别了出来,并将孤立的点标记为了噪声,你可以在第二张图中看到聚类的结果。

最后,聚类标签labels数组中的每个元素代表相应点的聚类标识。标签为 -1 的点表示噪声点,其他正数标签表示点所属的聚类编号。

这个模拟实例展示了DBSCAN如何在有噪声的情况下,成功地识别出不同的聚类。希望这有助于你更直观地理解DBSCAN算法的运作方式。

4. 算法评价:

优点:

形状灵活:能够发现任意形状的聚类,不仅仅是球形。

动态聚类数:不需要预先指定聚类的数量。

噪声处理:可以区分出噪声点和边界点。

缺点:

参数敏感:ε和MinPts的选择会直接影响聚类的结果。

密度不均:当聚类具有显著不同的密度时,可能难以得到好的结果。

DBSCAN是一个强大的聚类方法,特别是当数据集中的聚类形状是不规则的或者当数据中存在大量噪声时。它的优点在于能够自动确定聚类的数量并有效地隔离噪声。然而,选择正确的参数(如ε和MinPts)是非常关键的,因为这会直接影响到聚类的质量。在现实世界中,DBSCAN被广泛应用于各种领域,如天文学、生物学、地理信息系统和计算机视觉。

5. 算法的变体:

HDBSCAN(Hierarchical Density-Based Spatial Clustering of Applications with Noise)是一种基于层次的、用于识别具有噪声的空间聚类的算法,它是DBSCAN算法的扩展。该算法由R. J. G. B. Campello, D. Moulavi, 和J. Sander在2013年提出,目的是解决DBSCAN在处理不同密度聚类时的一些局限性。

基本原理为:HDBSCAN与DBSCAN共享相同的核心概念,即通过密度来定义聚类。然而,HDBSCAN通过构建层次结构,实现了对数据集中不同密度区域的聚类,使其更加灵活和稳健。

具体来说,HDBSCAN首先计算数据点之间的成对距离,然后基于这些距离构建一个最小生成树(Minimum Spanning Tree, MST)。 算法在最小生成树的基础上进行层次聚类,形成一个扩展的聚类树。在这个树中,叶节点代表原始数据点,而内部节点代表不同层次的聚类。最后,HDBSCAN通过一种基于稳定性的方法剪枝聚类树,以识别最终的聚类。这一步骤使得HDBSCAN能够识别并忽略噪声点,同时确定不同密度的聚类。

优点:

不同密度聚类:HDBSCAN能够自适应地识别不同密度的聚类,这是其相对于DBSCAN的显著优势。

无需预设聚类数量:与DBSCAN一样,HDBSCAN不需要用户预先设定聚类的数量。

灵活性:由于其层次性质,HDBSCAN可以适应各种形状和规模的聚类。

引用:

Campello, R. J. G. B., Moulavi, D., & Sander, J. (2013). Density-Based Clustering Based on Hierarchical Density Estimates. In Pacific-Asia Conference on Knowledge Discovery and Data Mining (pp. 160-172). Springer, Berlin, Heidelberg.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT1490 修改字符串

原题链接:https://www.matiji.net/exam/brushquestion/490/778/B3FCFEC101BD05189BB74D522E019504 输入1个字符串, 如果其中小写字符多于大写字符,则将其全部转换为小写字符,如果大写字符多于小写字符,则全部转换为大写字符。 输入格式&…

高精度铸铁平台制造工艺有多精细——河北北重机械

高精度铸铁平台制造工艺通常包括以下几个步骤: 材料准备:选择合适的铸铁材料,并确保其质量符合要求。常用的铸铁材料包括灰铸铁、球墨铸铁等。 模具制造:根据平台的设计要求,制造适用的模具。模具一般由砂型、金属模具…

基于springboot+mysql+Shiro实现的宠物医院管理系统

1.项目介绍 系统主要为用户提供了管理员权限的用户,实现了前台查看客户信息、在线添加预约等;后台管理医生坐诊信息、管理就诊信息、修改密码,管理公告、管理宠物分类、管理就诊、管理用户、修改密码等。在设计方面,本系统采用MV…

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

我国高纯电子级过氧化氢产量逐渐增长 未来有望实现完全国产替代

我国高纯电子级过氧化氢产量逐渐增长 未来有望实现完全国产替代 高纯电子级过氧化氢是氧化氢产品中技术含量最高的细分品类&#xff0c;多用于印刷电路板蚀刻、硅片清洗、光刻胶剥离等方面。经过多年发展&#xff0c;高纯电子级过氧化氢制备工艺已经成熟&#xff0c;大致可分为…

系统设计实例(二)新闻订阅系统

新闻订阅系统的设计和实现 Web 服务器&#xff1a;Web 服务器将流量重定向到不同的内部服务。Post 服务&#xff1a;在数据库和缓存中持久化帖子。Fanout 服务&#xff1a;将新内容推送到朋友的新闻订阅中。新闻订阅数据存储在缓存中以便快速检索。通知服务&#xff1a;通知朋…

设置客户端桌面壁纸 文件夹重定向

域策略-设置客户端桌面壁纸 1/服务器管理器组策略管理-gwy.com-Defait Domain Policy-右击编辑 2/用户配置-首选项-置windows设置-文件夹-右击文件夹-创建-C:\bgp-应用 3/在客户端策略更新-gpupdate /force 命令符-查看是否正确 4/服务器创建c:\image\R-C.jpg&#xff0c;共享文…

【什么是Internet?网络边缘,网络核心,分组交换 vs 电路交换,接入网络和物理媒体】

文章目录 一、什么是Internet&#xff1f;1.从具体构成角度来看2.从服务角度来看 二、网络结构1.网络边缘1.网络边缘&#xff1a;采用网络设施的面向连接服务1.1.目标&#xff1a;在端系统之间传输数据1.2.TCP服务 2.网络边缘&#xff1a;采用网络设施的无连接服务2.1目标&…

Zotero引入英文参考文献作者都是大写字母问题

修改之前是这样的&#xff1a; 修改过程 进入word 打开样式编辑器 打开后&#xff0c;找到这里&#xff1a; 删除 text-case“uppercase” 就可以实现这个样式&#xff1a; 然后我们点击保存&#xff0c;将这个样式文件另存为&#xff0c;然后替换掉原来的文件 源文件在 …

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径&#xff0c;其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题&#xff1a;给定一个加权连通图中的特定起点&#xff0c;目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是&#xff0c;这里关心…

技巧 获取指定文件夹下的所有文件名称

一. powershell脚本 当一行命令太长的时候&#xff0c;使用反引号 来换行 # 设置要扫描的文件夹路径 $folderPath "E:\mp3"# 构建输出文件的完整路径,将结果输出到桌面上的all_file_name.txt文件中 $outputFilePath [System.IO.Path]::Combine([System.Environm…

档案著录员好干吗

档案著录员是负责对档案资料进行著录、整理和管理的专业人员。他们的工作主要包括&#xff1a; 1. 著录档案资料&#xff1a;根据相关规范和标准&#xff0c;对档案资料进行详细的著录&#xff0c;包括档号、题名、日期、责任者、关键词等信息&#xff0c;以便于后续的检索和利…

缅甸的大开发时代即将到来 缅文wordpress主题模板

Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板&#xff0c;简洁实用的外贸公司wordpress外贸建站模板。 https://www.jianzhanpress.com/?p4565

蓝桥杯(2):python基础算法【下】

贪心、双指针、二分 11 贪心 11.1 定义 11.2 适用情况 如何判断&#xff1f;&#xff1f;&#xff1f;&#xff01; 11.3 实例 11.3.1 石子合并 只考虑一步&#xff0c;每次都找最小的 那么问题的核心就是&#xff1a;如何选出最小的&#xff01; #石子合并 import heapqn…

Pytorch神经网络-元组/列表如何喂到神经网络中

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

【c++入门】命名空间,缺省参数与函数重载

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff01;本篇内容我们进入一个新的阶段&#xff0c;进入c的学习&#xff01;希望我的博客内容能对你有帮助&#xff01; 目录 1.c关键字2.第一个c代码3.命名空间3.1 nam…

Linux - 线程互斥和互斥锁

文章目录 前言一、为什么要线程互斥原子性 二、互斥锁互斥锁的创建与销毁互斥锁进行互斥 前言 前几节课&#xff0c;我们学习了多线程的基础概念&#xff0c;这节课&#xff0c;我们来对线程互斥和互斥锁的内容进行学习。 一、为什么要线程互斥 首先我们要明白&#xff0c;对…

AOP切面编程

1.基本概念&#xff1a; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;&#xff0c;跟oop面向过程编程相对&#xff0c;AOP一般用于将公共逻辑和业务逻辑进行拆分&#xff0c;可以减少代码间的耦合性。 有道翻译&#xff1a;AOP—面向切面…

jsp2024.3.21(4) html基础

一、实验目的 1、html 文件的基本结构&#xff1b; 2、html 的常用标记&#xff1b; <HTML> <HEAD> …… </HEAD> <BODY> …… </BODY> </HTML> 二、实验项目内容&#xff08;实验题目&#xff09; HTML常用标记 1&#xff0e;<…