DBSCAN聚类算法及Python实现

news2024/11/15 23:48:58

 

DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,可以将数据点分成不同的簇,并且能够识别噪声点(不属于任何簇的点)。

DBSCAN聚类算法的基本思想是:在给定的数据集中,根据每个数据点周围其他数据点的密度情况,将数据点分为核心点、边界点和噪声点。核心点是周围某个半径内有足够多其他数据点的数据点,边界点是不满足核心点要求,但在某个核心点的半径内的数据点,噪声点则是不满足任何条件的点。接着,从核心点开始,通过密度相连的数据点不断扩张,形成一个簇。

DBSCAN算法的优点是能够处理任意形状的簇,不需要先预先指定簇的个数,能够自动识别噪声点并将其排除在聚类之外。然而,该算法的缺点是对于密度差异较大的数据集,可能无法有效聚类。此外,算法的参数需要根据数据集的特性来合理选择,如半径参数和密度参数。

例子

假设我们有以下的数据点集合:[(1,1), (1,2), (2,1), (8,8), (8,9), (9,8), (15,15)]

我们可以使用DBSCAN算法来将这些点分成不同的簇。首先,我们需要设置两个参数:半径a和最小样本数minPts。这里我们设置 a=2 ,minPts=3。

接下来,我们从数据集中选取一个点,比如第一个点(1,1)作为种子点,并将该点标记为“核心点”,因为它周围有超过 minPts 个点在半径 a 的范围内。然后,我们找到与该点距离在 a 内的所有点,将它们标记为与该点“密度可达”(density-reachable),并将这些点加入同一个簇中。这里包括(1,2)和(2,1)。

接着,我们选取下一个未被分类的点,这里是(8,8),将其标记为“核心点”,并将与它距离在  内的所有点加入同一簇中,这里包括(8,9)和(9,8)。

最后,我们选取最后一个未被分类的点,(15,15),但该点只有1个点在 a 内,不足以满足minPts  的要求,因此该点被标记为噪声点。

于是,最终的聚类结果为:

Cluster 1: [(1,1), (1,2), (2,1)]
Cluster 2: [(8,8), (8,9), (9,8)]
Noise: [(15,15)]

可以看出,DBSCAN算法成功地将数据点分成了两个簇,并且将噪声点(15,15)排除在聚类之外。

Python实现

例1

我们还是以上面例子为例,进行Python实现:

from sklearn.cluster import DBSCAN
import numpy as np

# 输入数据
X = np.array([(1,1), (1,2), (2,1), (8,8), (8,9), (9,8), (15,15)])

# 创建DBSCAN对象,设置半径和最小样本数
dbscan = DBSCAN(eps=2, min_samples=3)

# 进行聚类
labels = dbscan.fit_predict(X)

# 输出聚类结果
for i in range(max(labels)+1):
    print(f"Cluster {i+1}: {list(X[labels==i])}")
print(f"Noise: {list(X[labels==-1])}")

结果为:

Cluster 1: [array([1, 1]), array([1, 2]), array([2, 1])]
Cluster 2: [array([8, 8]), array([8, 9]), array([9, 8])]
Noise: [array([15, 15])]

与手算结果一致。

以上Python实现中,首先我们定义了一个数据集X,它包含了7个二维数据点。然后,我们创建了一个DBSCAN对象,将半径设置为2,最小样本数设置为3。这里我们使用scikit-learn库提供的DBSCAN算法实现。

我们将数据集X输入到DBSCAN对象中,调用fit_predict()方法进行聚类,返回的结果是每个数据点所属的簇标签。标签为-1表示该点为噪声点。

最后,我们遍历所有簇标签,输出每个簇中的数据点。在输出簇标签时,我们将标签从0开始,因此需要加上1。

输出结果显示,数据点被分成了两个簇和一个噪声点,与前面手动计算的结果一致。

算法参数详解

下面对sklearn.cluster模块中的参数进行说明.该函数的调用方法为DBSCAN(eps=0.5, *, min_samples=5, metric='euclidean', metric_params=None, algorithm='auto', leaf_size=30, p=None, n_jobs=None)

该算法提供了多个可调参数,以控制算法的聚类效果。下面对常用的参数进行详细说明:

  • eps: 控制着半径的大小,是判断两个数据点是否属于同一簇的距离阈值。默认值为0.5。

  • min_samples: 控制着核心点周围所需的最小数据点数。默认值为5。

  • metric: 用于计算距离的度量方法,可以选择的方法包括欧式距离(euclidean)、曼哈顿距离(manhattan)等。默认值为欧式距离。

  • algorithm: 用于计算距离的算法,可以选择的算法包括Ball Tree(ball_tree)、KD Tree(kd_tree)和brute force(brute)。Ball Tree和KD Tree算法适用于高维数据,brute force算法适用于低维数据。默认值为auto,自动选择算法。

  • leaf_size: 如果使用Ball Tree或KD Tree算法,这个参数指定叶子节点的大小。默认值为30。

  • p: 如果使用曼哈顿距离或闵可夫斯基距离(minkowski),这个参数指定曼哈顿距离的p值。默认值为2,即欧式距离。

  • n_jobs: 指定并行运算的CPU数量。默认值为1,表示单CPU运算。如果为-1,则使用所有可用的CPU。

  • metric_params: 如果使用某些度量方法需要设置额外的参数,可以通过这个参数传递这些参数。默认值为None。

这些参数对于控制DBSCAN算法的聚类效果非常重要,需要根据具体的数据集和需求进行选择和调整。在使用DBSCAN算法时,我们通常需要对这些参数进行多次实验和调整,以达到最佳的聚类效果。

例2:鸢尾花数据集

再以著名的鸢尾花数据集为例进行Python实现

from sklearn.cluster import DBSCAN
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

# 加载数据集
iris = load_iris()
X = iris.data

# 数据预处理,标准化数据
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 使用DBSCAN聚类算法
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_pred = dbscan.fit_predict(X)

# 输出聚类结果
print('聚类结果:', y_pred)

上述代码首先使用load_iris()函数加载了iris数据集,然后使用StandardScaler()对数据进行标准化处理。使用DBSCAN类创建了一个DBSCAN对象,并传递了epsmin_samples参数的值。最后,使用fit_predict()方法对数据进行聚类,并将聚类结果存储在y_pred变量中,最后打印聚类结果。

结果如下:

聚类结果: [ 0  0  0  0  0  0  0  0  0  0  0  0  0  0 -1 -1  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0 -1 -1  0  0  0  0  0  0  0 -1  0  0  0  0  0  0
  0  0  1  1  1  1  1  1 -1 -1  1 -1 -1  1 -1  1  1  1  1  1 -1  1  1  1
 -1  1  1  1  1  1  1  1  1  1  1  1  1 -1  1 -1  1  1  1  1  1 -1  1  1
  1  1 -1  1 -1  1  1  1  1 -1 -1 -1 -1 -1  1  1  1  1 -1  1  1 -1 -1 -1
  1  1 -1  1  1 -1  1  1  1 -1 -1 -1  1  1  1 -1 -1  1  1  1  1  1  1  1
  1  1  1  1 -1  1]

不过这次结果中将很多点设置为了噪声点(当然我们可以将噪声点归为一类),如果觉得现在的结果不满意,可以进一步调整算法中的参数。

 

参考资料:

【1】https://mp.weixin.qq.com/s/z6AgcvUP3-FwtwCyyQHgPg

【2】sklearn.cluster.DBSCAN — scikit-learn 1.2.2 documentation

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

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

相关文章

告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目一、前言二、如何选择版本2.1 SpringCloud 和 Spring Boot 版本选型2.1.1 Spring Cloud 版本与 Spring Boot 版本关系2.1.2 选择具体的合适版本2.2 第三方组件的版本选型三、…

SpringCloud之Eureka原理分析与实战(注册与发现)

目录 1、从本质理解服务治理思想 2、为什么选择Spring Cloud服务治理组件 3、Spring Cloud Eureka服务发现 3.1 Eureka的优势 3.2 Eureka架构组成 3.3 搭建Eureka Server 实战 3.3.1 添加依赖 3.3.2 开启服务注册 3.3.3 添加YML配置 3.3.4 访问服务 3.4 搭建Eureka …

【c语言】指针数组、数组指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT&#xff0c;要多少人才能开发出来&#xff1f;几百&#xff0c;还是几千&#xff1f; 答案是&#xff1a;87个人。 老实说&#xff0c;刚看到这个数字真是惊到我了&#xff0c;印象里&#xff0c;之前看媒体报道各大巨头人工智能人才储备时&#xff0c;动辄…

学编程应该选择什么操作系统?

今天来聊一个老生常谈的问题&#xff0c;学编程时到底选择什么操作系统&#xff1f;Mac、Windows&#xff0c;还是别的什么。。 作为一个每种操作系统都用过很多年的程序员&#xff0c;我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…

Linux服务器如何查看CPU使用率、内存占用情况

Linux服务器如何查看CPU使用率、内存占用情况 作为Linux运维工程师&#xff0c;系统维护过程以及日常工作中需要我们经常查看CPU使用率、内存使用率、带宽占用&#xff0c;从资源使用的程度分析系统整体的运行情况。 在 Linux 上查看资源使用情况有很多命令可以参考&#xff0c…

【SpringMVC】9—底层原理

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

基于springboot和ajax的简单项目 02 代码部分实现,xml文件sql语句优化 (中)

上次说到了log/log_list.html的doGetObjects()&#xff0c;其中有doFindPageObjects&#xff08;&#xff09;方法。 找到全部的日志对象&#xff0c;并且输出到div上。这里是后台的代码。 01.pojo对象&#xff0c;这里需要序列化保存。序列化的作用是保存对象到内存缓存中&am…

腾讯38K测试良心分享,熬夜整理10万字详细软件测试面试笔记

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。 所以&#xff0c;八股文面…

普通人如何使用ChatGPT接单挣钱-第一弹

嘿&#xff0c;我是灵牧&#xff0c;今天这一期给大家带来的是普通人如何使用chatGPT挣钱的第一期 第一弹&#xff1a;通过GPT写一个Tkinter数独案例赚取&#xffe5;50 事情原委&#xff1a; 今天在接单群里看到一个Tkinter写数独的需求案例&#xff0c;想要加一个独立的弹…

Golang每日一练(leetDay0031)

目录 91. 解码方法 Decode Ways &#x1f31f;&#x1f31f; 92. 反转链表 II Reverse Linked List II &#x1f31f;&#x1f31f; 93. 复原 IP 地址 Restore IP Addresses &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练…

pdf转excel表格怎么做?这3种方法简单又方便

在日常工作和生活中&#xff0c;我们经常需要转换不同格式的文件&#xff0c;比如将PDF转换为Excel表格。虽然转换过程看似简单&#xff0c;但实际上要想转换好&#xff0c;选择一款专业的PDF转换器是非常必要的。今天&#xff0c;我将为大家介绍几款值得推荐的PDF转换器&#…

一文全解经典机器学习算法之线性回归(关键词:回归分析、最小二乘法、极大似然估计、梯度下降法、逻辑回归、对数几率、线性判别分析)

文章目录一&#xff1a;线性回归基本概念&#xff08;1&#xff09;回归分析&#xff08;2&#xff09;线性回归二&#xff1a;线性回归确定参数的方法&#xff08;1&#xff09;最小二乘法A&#xff1a;代数求法B&#xff1a;矩阵求法&#xff08;主要使用&#xff09;&#x…

国产大模型狂飙,谁能率先做出第一个中国版GPT

热火烹油的大模型赛道打起了“嘴仗”。 搜狗前CEO王小川评价百度创始人李彦宏的采访发言称&#xff1a;“你们采访的可能是平行世界的他&#xff0c;不是我们这个世界里的。” 而针对王小川的评论&#xff0c;百度集团副总裁、搜索平台负责人肖阳又回应道&#xff1a;“王小…

JavaSE补充 | 网络编程

目录 一&#xff1a;网络编程 1. 网络编程概述 2. 网络通信要素 3. 传输层协议&#xff1a;TCP 与 UDP 协议 4. 网络编程 API 5. TCP网络编程 6. UDP 网络编程 7. URL编程 一&#xff1a;网络编程 1. 网络编程概述 Java是 Internet 上的语言&#xff0c;它从语言级上提…

【redis】单线程 VS 多线程(入门)

【redis】单线程 VS 多线程&#xff08;入门&#xff09; 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#…

Python之数据库操作(连接数据库,增删改查操作,易错点理解)

文章目录 前言一、Python之数据库操作二、pymysql 安装三、pymysql 包引入 连接数据库创建游标执行sql数据 - 增删改查要获取查询结果数据关闭游标&#xff0c;关闭数据库连接总结前言 记录&#xff1a;Python操作数据库的步骤&#xff0c;不容易理解的地方。 一、Python之数据…

开局一张图,构建神奇的 CSS 效果

假设&#xff0c;我们有这样一张 Gif 图&#xff1a; 利用 CSS&#xff0c;我们尝试来搞一些事情。 图片的 Glitch Art 风 在这篇文章中 --CSS 故障艺术&#xff0c;我们介绍了利用混合模式制作一种晕眩感觉的视觉效果。有点类似于抖音的 LOGO。 像是这样&#xff1a; 假设…

14、DRF实战总结:获取Django请求路径的方法以及各自的区别

Django项目开发中经常需要在视图中获取用户当前请求url的地址&#xff0c;然后进行跳转或判断操作&#xff0c;比如是否在url黑白名单里。Django提供了多种获取请求路径的实现方式&#xff0c;比如request.path, request.path_info, request.get_full_path和request.build_abso…

【Python】【进阶篇】十六、Python爬虫的浏览器实现抓包

目录十六、Python爬虫的浏览器实现抓包16.1 控制台界面16.1.1 NetWork16.1.2 Sources16.1.3 Console16.1.4 Application16.2 数据包抓取16.3 看变化规律十六、Python爬虫的浏览器实现抓包 几乎所有浏览器都提供了抓取数据包的功能&#xff0c;因为浏览器为抓包提供了一个专门的…