DBSCAN 揭秘:了解此算法的工作原理

news2024/11/23 7:50:36

一、说明

        DBSCAN 代表 基于密度的带噪声应用程序空间聚类。它是一种流行的聚类算法,用于机器学习和数据挖掘,根据数据集中紧密排列在一起的点与其他点的距离对点进行分组。

二、DBSCAN的算法原理

        DBSCAN 的工作原理是将数据划分为由密度较低的区域分隔的点的密集区域。它将聚类定义为数据集中有许多点彼此靠近的区域,而远离任何聚类的点被视为异常值或噪声。

        为了理解算法的工作原理,我们将通过一个简单的示例。假设我们有一个如下所示的点数据集:

数据点 

        我们的目标是将这些点聚集成密集的组。首先,我们计算接近每个点的点数。例如,如果我们从绿点开始,我们在它周围画一个圆。

图片由作者提供。

圆的半径ε(epsilon)是我们在使用DBSCAN时必须确定的第一个参数。

画完圆后,我们计算重叠。例如,对于我们的黄点,有 5 个接近点。

同样,我们计算所有剩余点的关闭点数。

         接下来,我们将确定另一个参数,最小点数 m。 如果每个点至少接近 m 个其他点,则将其视为核心点。例如,如果我们以 m 为 3,那么紫色点被视为核心点,但黄色点不是,因为它周围没有任何接近点。

核心点  

        然后,我们随机选择一个核心点并将其分配为第一个聚类中的第一个点。接近该点的其他点也分配给同一聚类(即,在所选点的圆内)。

 

然后,我们将其扩展到其他接近的点。

 ​​​​​​​        当我们无法为第一个集群分配更多核心点时,我们会停止。一些核心要点即使接近第一组,也无法指定。我们画出这些点的圆圈,看看第一个聚类是否靠近核心点。如果有重叠,我们把它们放在第一个集群中。

        但是,我们不能分配任何非核心点。它们被视为异常值。

        现在,我们仍然有核心点没有分配。我们从中随机选择另一个点并重新开始。

        DBSCAN 按顺序工作,因此请务必注意,非核心点将分配给满足接近度要求的第一个集群。

三、python实现

        我们可以从 中使用类。在实现任何模型之前,让我们更好地了解该类。我们可以将一些参数传递给对象。DBSCANsklearnDBSCAN

  • eps:将它们视为相邻点的两个点之间的最大距离。彼此相距不远的点被视为同一聚类的一部分。eps
  • min_samples:将一个点视为核心点所需的最小点数。小于相邻点的点被标记为噪点。min_samples
  • metric:用于测量点之间距离的距离度量。默认情况下,使用欧氏距离,但可以使用其他指标,例如曼哈顿距离或余弦距离。
  • algorithm:用于计算每个点的最近邻的算法。默认值为 ,它根据数据的大小和维度选择最合适的算法。其他选项包括 、 和 。"auto""ball_tree""kd_tree""brute"
  • leaf_size:或算法中使用的叶节点的大小。较小的叶子尺寸导致更准确但更慢的树木构造。ball_treekd_tree
  • p:闵可夫斯基距离度量的功率参数。当 ,这相当于曼哈顿距离,当 ,这相当于欧几里得距离。p=1p=2
  • n_jobs:用于并行计算的 CPU 内核数。设置为 使用所有可用内核。-1

现在,让我们先生成一些虚拟数据。

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

# generation of nested dummy data
X, y = make_blobs(n_samples=1000, centers=[[0, 0], [0, 5], [5, 5]], cluster_std=[1.0, 0.5, 1.0])

plt.scatter(X[:,0], X[:,1], color='blue')
plt.show()

数据。图片由作者提供。

并且,模型:

from sklearn.cluster import DBSCAN

# model
dbscan = DBSCAN(eps=0.5, min_samples=5)
labels = dbscan.fit_predict(X)

# the number of clusters found by DBSCAN
n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
print(f"Number of clusters found by DBSCAN: {n_clusters}")
# Number of clusters found by DBSCAN: 3

现在,让我们绘制聚类。

import numpy as np

unique_labels = set(labels)
colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        col = [0, 0, 0, 1]  # Black color for noise points (label=-1)
    class_member_mask = (labels == k)
    xy = X[class_member_mask]
    plt.scatter(xy[:, 0], xy[:, 1], s=50, c=[col], marker='o', alpha=0.5)

plt.title('DBSCAN Clustering')
plt.show()

DBSCAN 集群。图片由作者提供。

# attributes of the dbscan object
print("Indices of core samples: ", dbscan.core_sample_indices_)
print("Copy of each core sample found by training: ", dbscan.components_)
print("Labels: ", dbscan.labels_)
print("Number of features seen during fit: ", dbscan.n_features_in_)

四、结论

        DBSCAN 具有多种优势,使其成为适用于许多类型数据集和聚类任务的常用聚类算法。首先,它能够识别任何形状的聚类,使其比 k 均值或分层聚类更通用。

        其次,它对噪声具有鲁棒性,这意味着它可以有效地识别和忽略不属于任何集群的噪声点。这使其成为数据清理和异常值检测的有用工具。

        第三,它是一种无参数聚类算法,这意味着它不需要用户提前指定聚类的数量。在最佳聚类数未知或难以确定的情况下,这可能是一个主要优势。

        最后,DBSCAN在时间复杂度为O(n log n)的大型数据集上是有效的,使其成为具有数百万个点的数据的可扩展算法。

        尽管DBSCAN有许多优点,但它也有几个弱点。首先,它的性能可能对超参数的选择很敏感,特别是和,这可能需要一些反复试验才能找到最佳值。eps,min_samples

        其次,DBSCAN在具有明显不同密度的集群的数据集上可能表现不佳。这是因为一个聚类的最佳值对于另一个聚类来说可能太大或太小,从而导致聚类识别不佳。eps

        第三,由于“维数诅咒”,DBSCAN的性能在高维数据上可能会受到限制,在高维空间中,点之间的距离变得不那么有意义。这可能导致簇识别不佳,并且可能需要将降维技术与 DBSCAN 结合使用。奥坎·耶尼根

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

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

相关文章

数据结构与算法:数据结构基础

目录 数组 定义 形式 顺序存储 基本操作 读取元素 更新元素 插入元素 删除元素 扩容 初始化 时机 步骤 优劣势 链表 定义 单向链表 特点 双向链表 随机存储 基本操作 查找节点 更新节点 插入节点 删除元素 数组VS链表 栈与队列 栈 定义 基本操作…

分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测

分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测 目录 分类预测 | Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现SO-RF蛇群算法优化随机森林多输入分类预测(完整源码和数据&…

notepad++去除每一行第二个等号之后的内容解决ResolvePackageNotFound

([^])$ 正则表达式用第一行的 https://blog.csdn.net/Charlotte_Si/article/details/132333988 原文的正则表达式不知道为什么没用

XXE-Lab for PHP

环境配置 1.将靶场进行下载.... https://github.com/c0ny1/xxe-lab 2.将PHPStudy的中间件与版本信息调制为php-5.4.45Apache访问以下地址开始练习... http://127.0.0.1/xxelabs/php_xxe/ 靶场实操 1.在登录界面输入账号密码并抓取数据包.... 2.尝试读取本地文件.... <…

第6章_瑞萨MCU零基础入门系列教程之串行通信接口(SCI)

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

TCP协议报文,核心特性可靠的原因,超时重传详细介绍

目录 一、TCP协议 二、TCP核心特性的保障 三、保留的六位标志位对于应答报文的作用 四、如何处理丢包——超时重传的原理 五、超时重传的时间 一、TCP协议 每一行是四个字节&#xff0c;前面的20个字节是固定的&#xff08;TCP最短长度&#xff0c;20字节&#xff0c;选项…

进制和编码

目标&#xff1a;了解计算机中一些必备的尝试知识&#xff0c;了解常见名词背后的意义 1.python的运行方式 交互式运行脚本式运行 2.进制 2.1 进制的转换 计算机中底层的所有数据都是0101010101的形式存在的 八进制无法直接转为2进制 十进制转其他进制 bin(25) # 10进制转…

[XSCTF]easyxor

查看&#xff0c;main函数&#xff0c;首先是将输入的数据与key中的字符依次异或 在这个循环里&#xff0c;将异或得到的结果每次减去1&#xff0c;同时在数组里写上1&#xff0c;往后遍历数组 直到异或得到的结果减为0&#xff0c;在数组中写一个0进行标记 最后比较数组是否与…

百度飞桨(厦门)人工智能产业赋能中心签约,共创人工智能产业协同服务新生态...

9月8日&#xff0c;第二十三届中国国际投资贸易洽谈会在厦门正式开幕。 当日&#xff0c;厦门市思明区政府和火炬管委会&#xff0c;与百度正式签约&#xff0c;联手共建百度飞桨&#xff08;厦门&#xff09;人工智能产业赋能中心。思明区委书记林重阳&#xff0c;厦门市工信局…

【 NTR-domain ;NTR-C345C】

tissue inhibitors of metalloproteases (TIMP) TIMP NTR-C345C HPX-binding-domain [ MMP CAT(FN2)PEX (hemopexin) ] [ MMP-9-inhibitor a-2M (NTR-C345C) ] netrin Laminin-GLaminin-EGFNTR-domain

软件测试报告有什么用?

报告类型 不同的报告类型有不同的报告用途&#xff0c;以下分类别进行分析 1、登记测试报告 可以用于软件产品的增值税即征即退、软件企业的双软评估以及计算机系统集成资质的材料 2、鉴定\确认测试报告 可以用用于政府项目申报、高新认证、项目结题、创新产品认定、各类政…

c++11 override 和 final 关键字

1. final&#xff1a;修饰虚函数&#xff0c;表示该虚函数不能再被重写 如果一个类不想被继承&#xff1a;下面分别提供了c98 和 c11的不同写法 c 98 的写法&#xff1a; c 11 的写法&#xff1a;final最终类 2. override: 检查派生类虚函数是否重写了基类某个虚函数&#xff…

机器学习——K最近邻算法(KNN)

机器学习——K最近邻算法&#xff08;KNN&#xff09; 文章目录 前言一、原理二、距离度量方法2.1. 欧氏距离2.2. 曼哈顿距离2.3. 闵可夫斯基距离2.4. 余弦相似度2.5. 切比雪夫距离2.6. 马哈拉诺比斯距离2.7. 汉明距离 三、在MD编辑器中输入数学公式&#xff08;额外&#xff0…

C++数据结构X篇_11_C++栈的应用-后缀表达式求解

上篇C栈的应用-中缀转后缀中我们介绍了我们所熟知的中缀表达式转为后缀表达式&#xff0c;那么如何通过后缀表达式获得原表达式的值呢&#xff1f;本篇将会参考博文栈的应用-后缀表达式求解介绍计算机是如何基于后缀表达式计算的&#xff1f; 文章目录 1. 后缀表达式求解计算规…

【MySQL】一文带你理解索引事务及其原理

MySQL- 索引事务 文章目录 MySQL- 索引事务索引操作索引原理 事务操作并发执行 索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 通俗来…

C++项目实战——基于多设计模式下的同步异步日志系统-④-日志系统框架设计

文章目录 专栏导读模块划分日志等级模块日志消息模块日志消息格式化模块日志消息落地模块日志器模块日志器管理模块异步线程模块 模块关系图 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导…

新知同享 | Web 开发性能提升,优化体验

更加强大且开放的 Web 可以简化开发工作并支持 AI 一起来看 2023 Google 开发者大会上 Web 开发值得重点关注的升级与成果 了解 Web 如何实现加速开发&#xff0c;更加便捷 精彩大会现场一览 Web 开发不断发展&#xff0c;每年都带来性能提升和功能迭代&#xff0c;开启丰富多…

【多线程】volatile 关键字

volatile 关键字 1. 保证内存可见性2. 禁止指令重排序3. 不保证原子性 1. 保证内存可见性 内存可见性问题: 一个线程针对一个变量进行读取操作&#xff0c;另一个线程针对这个变量进行修改操作&#xff0c; 此时读到的值&#xff0c;不一定是修改后的值&#xff0c;即这个读线…

用python实现基本数据结构【01/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…

Linux 下spi设备驱动

参考&#xff1a; Linux kernel 有关 spi 设备树参数解析 Linux kernel 有关 spi 设备树参数解析 - 走看看 Linux SPI驱动框架(1)——核心层 Linux SPI驱动框架(1)——核心层_linux spi驱动模型_绍兴小贵宁的博客-CSDN博客 Linux SPI驱动框架(2)——控制器驱动层 Linux SPI驱…