DBSCAN聚类的Python 实现

news2024/12/26 2:54:48

一、说明

        DBSCAN(Density-Based Spatial Clustering of Applications with Noise)聚类是一种基于密度的聚类算法。它能够根据数据点的密度来将数据划分为不同的类别,并可以自动识别离群点。DBSCAN聚类算法的核心思想是将密度高的数据点划分为同一个簇,将密度低的数据点划分为噪声点。通过定义数据点之间的距离和密度阈值,DBSCAN可以在不需要事先确定簇的数量的情况下进行聚类。

二、DBSCAN概述

        聚类应用于数据集以对相似的数据点集进行分组。它寻找数据点中的相似点和不同点,并将它们混杂在一起。聚类中没有标签。聚类是一种无监督学习,旨在发现数据集的底层结构。 

2.1 聚类算法的类型:

  • 基于分区的聚类
  • 模糊聚类
  • 层次聚类
  • 基于网格的聚类
  • 独家聚类
  • 重叠聚类
  • 基于密度的聚类

        在本博客中,我们将重点介绍基于密度的聚类方法,特别是结合 scikit-learn 的 DBSCAN 算法。基于密度的算法擅长发现高密度区域和异常值。它通常用于异常检测和非线性数据集聚类。

2.2 DBSCAN性质

1)DBSCAN聚类算法的优缺点包括:

  • 不需要预先指定簇的数量。
  • 能够识别离群点和噪声点。
  • 能够处理任意形状的簇。
  • 对于密度高的簇能够表现出色。

2)DBSCAN聚类算法的缺点包括:

  • 对于密度低的簇,聚类效果可能不如其他算法。
  • 对于高维数据,聚类效果可能不佳。

3)DBSCAN聚类算法的应用包括:

  • 图像分割
  • 地理信息系统中的空间聚类
  • 计算机视觉中的对象跟踪
  • 社交网络分析中的社群发现

 

三、DBSCAN的构建

        DBSCAN(基于密度的噪声应用空间聚类)是一种基于密度的无监督学习算法。它计算最近邻图以查找任意形状的簇和异常值。而 K 均值聚类会生成球形聚类。 

        DBSCAN 最初不需要K个簇。相反,它需要两个参数:eps 和 minPts。

  • eps:它是特定邻域的半径。如果两点之间的距离小于或等于 esp,则将其视为其邻居。
  • minPts:给定邻域中形成簇的最小数据点数量。 

        DBSCAN 使用这两个参数来定义核心点、边界点或离群点。

 

 

四、DBSCAN 聚类算法如何工作?

 

  1. 随机选择任意点p。如果邻域中的  数据点多于minPts,则也称为核心点。
  2. 它将使用epsminPts来识别所有密度可达点。
  3. 如果p是核心点,  它将使用epsminPts创建一个簇。
  4. 如果p边界点,它将移动到下一个数据点。如果一个数据点的邻域内  点数少于minPts ,则该数据点称为边界点。
  5. 该算法将继续下去,直到访问完所有点。

 

五、Python 中的 DBSCAN 聚类

 

        我们将使用 Deepnote 笔记本来运行该示例。它预装了 Python 包,因此我们只需导入 NumPy、pandas、seaborn、matplotlib 和 sklearn 即可。 

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN

        我们正在使用来自 Kaggle 的商城客户细分数据。它包含客户的年龄、性别、收入和支出分数。我们将使用这些功能来创建各种集群。 

        首先,我们将使用 pandas `read_csv` 加载数据集。然后,我们将选择三列(“年龄”、“年收入 (k$)”、“支出分数 (1-100)”)来创建X_train数据框。 

df = pd.read_csv('Mall_Customers.csv')
X_train = df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']]

        我们将使用eps 12.5 和min_sample 4 将X_train拟合到 DBSCAN 算法上。之后,我们将从 X_train 创建一个DBSCAN_dataset使用clustering.labels_创建一个“Cluster”列。 

clustering = DBSCAN(eps=12.5, min_samples=4).fit(X_train)
DBSCAN_dataset = X_train.copy()
DBSCAN_dataset.loc[:,'Cluster'] = clustering.labels_

        为了可视化集群的分布,我们将使用 value_counts() 并将其转换为数据帧。 

如您所见,我们有 5 个聚类和 1 个异常值。“0”簇的大小最大,有 112 行。 

DBSCAN_dataset.Cluster.value_counts().to_frame()

 

在本节中,我们将使用上述信息并可视化散点图。  

有两个图:“年收入与支出分数”和“年收入与年龄”。簇由颜色定义,异常值被定义为小黑点。 

可视化清楚地显示了每个客户如何属于 5 个集群之一,我们可以使用此信息为紫色集群的客户提供高端优惠,为深绿色集群的客户提供更便宜的优惠。 

 
 
outliers = DBSCAN_dataset[DBSCAN_dataset['Cluster']==-1]

fig2, (axes) = plt.subplots(1,2,figsize=(12,5))

sns.scatterplot('Annual Income (k$)', 'Spending Score (1-100)',

                data=DBSCAN_dataset[DBSCAN_dataset['Cluster']!=-1],

                hue='Cluster', ax=axes[0], palette='Set2', legend='full', s=200)

sns.scatterplot('Age', 'Spending Score (1-100)',

                data=DBSCAN_dataset[DBSCAN_dataset['Cluster']!=-1],

                hue='Cluster', palette='Set2', ax=axes[1], legend='full', s=200)

axes[0].scatter(outliers['Annual Income (k$)'], outliers['Spending Score (1-100)'], s=10, label='outliers', c="k")

axes[1].scatter(outliers['Age'], outliers['Spending Score (1-100)'], s=10, label='outliers', c="k")
axes[0].legend()
axes[1].legend()

plt.setp(axes[0].get_legend().get_texts(), fontsize='12')
plt.setp(axes[1].get_legend().get_texts(), fontsize='12')

plt.show()


 

六、结论

        DBSCAN 是用于客户细分的众多算法之一。您可以使用 K 均值或分层聚类来获得更好的结果。聚类算法通常用于推荐引擎、市场和客户细分、社交网络分析和文档分析。 

        在本博客中,我们学习了基于密度的算法 DBCAN 的基础知识,以及如何使用它通过 scikit-learn 创建客户细分。您可以通过使用轮廓得分和热图查找最佳epsmin_samples来改进算法。 

 

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

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

相关文章

MongoDB——关于NumberLong处理大整数

1、问题 MongoDB根据某个Long类型ID查询数据查不出来 db.getCollection(school_work_section).find({school_work_section_id:577199363866206209}); 2、解决办法 Long类型的需要在NumberLong的对象里加上双引号才能查出来 db.getCollection(school_work_section).find({sc…

初识C语言——详细入门一(系统性学习day4)

目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2&#xf…

搭建ELK+Filebead+zookeeper+kafka实验

一、ELKFilebeadzookeeperkafka架构 第一层:数据采集层(Filebeat) 数据采集层位于最左边的业务服务集群上,在每个业务服务器上面安装了filebead做日志收集,然后把采集到的原始日志发送到kafkazookeeper集群上。 第二…

文件拷贝【 使用字节流完成文件的复制(支持一切文件类型的复制)】

需求: 把某个视频复制到 E:\\videocopy\\new.mp4 思路: 根据 数据源 创建字节输入流对象根据 目的地 创建字节输出流对象读写数据,复制视频释放资源 可以拷贝 视频 ,图片 ,文本.txt 等文件 package com.csdn.d2_byte_…

Linux grep命令

①grep命令——过滤文件 这是txt.txt的内容 通过grep管道符查找gcc内容在txt.txt文件中 查找gcc所处行位置,加上-n 查找有多个相同内容的数据 ②wc命令——数量统计 统计数据如图: ③管道符——左边结果作为右边输入 如下图所示统计txt.txt文件"-&…

连续性数据进行Meta荟萃分析

Meta荟萃分析(也称Meta分析,元分析,异质性分析等),其是一种综合各种文献结论,进而汇总综合评价的方法,Meta分析常用于医学、心理学、教育学、生态学等专业领域。通俗地看,Meta分析是…

物 理 层

二、物理层 1、物理层的基本概念 物理层的作用:尽可能的屏蔽掉传输媒体和通信手段的差异,使物理层上面的数据链路层感觉不到这些差异,使其只需要考虑如何完成本层的协议和服务 1.1、物理层的主要任务 机械特性:指明接口所用的接线器的形状…

【计算机视觉】1. 计算机视觉基础理论知识和框架(Basic Concepts)

什么是计算机视觉? 一、什么是计算机视觉二、二个研究维度三、研究挑战3.1 像素与语义之间的GAP3.2 视觉变化3.3 光照变化3.4 尺度变化3.5 形态变化3.6 背景复杂3.7 遮挡3.8 内外 四、计算机视觉框架4.1 计算机视觉基础4.2 深度学习算法理论基础4.3 深度学习算法 五、计算机视…

SpringBoot3与IDE中配置JDK17

概述 SpringBoot3需要JDK17的支持,不再支持JDK8。 如果要运行SpringBoot3的项目,根据使用的IDE,需要的配置不同。 配置说明 1. SpringToolSuite4 如果使用的是SpringToolSuite4(STS),比较简单&#xf…

接入网技术

接入网 接入网是指骨干网络到用户或企业之间的所有设备。其长度一般为几百米到几公里,因而形象地被称为“最后一公里”。接入网地接入方式包括铜线(普通电话线)接入、基于双绞线的ADSL技术、基于HFC网(光纤和同轴电缆(有线电视电缆)混合网)的Cable Modem技术、光纤接入…

「聊设计模式」之职责链模式(Chain of Responsibility)

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 前言 设计模式是解决软件开发中常见问题的可复用解决方案。其中…

一篇文章教你Pytest快速入门和基础讲解,一定要看!

前言 目前有两种纯测试的测试框架,pytest和unittestunittest应该是广为人知,而且也是老框架了,很多人都用来做自动化,无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架出去面试也好,跟别…

爬虫工作者必备:使用爬虫ip轻松获得最强辅助

在进行网络数据爬取时,爬虫ip成为了爬虫工作者们的得力辅助。通过使用爬虫ip,可以实现IP地址的伪装和分布式请求,有效规避访问限制和提高爬取效率。本文将为爬虫工作者们分享关于使用爬虫ip的知识,帮助您轻松获取最强辅助&#xf…

【JavaEE】多线程案例-单例模式

文章目录 1. 前言2. 什么是单例模式3. 如何实现单例模式3.1 饿汉模式3.2 懒汉模式4. 解决单例模式中遇到的线程安全问题4.1 加锁4.2 加上一个判断解决频繁加锁问题4.2 解决因指令重排序造成的线程不安全问题 1. 前言 单例模式是我们面试中最常考到的设计模式。什么是设计模式呢…

Linux 用户注意!GNOME 45 将影响所有扩展!

GNOME 45 是一次重要的升级,但对扩展的影响并不令人满意! 每当 GNOME 升级,总会有一些扩展遭遇问题,这点并不新鲜。但如今,到了 GNOME 45,每个扩展都将面临问题! 那么,究竟是什么原…

Lua学习笔记:探究package

前言 本篇在讲什么 理解Lua的package 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践,轻理论,快速上手 提供全流程的源码内容 ★提高阅读体验★ 👉 ♠ 一级…

怒刷LeetCode的第8天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:双指针和排序 ​编辑第二题 题目来源 题目内容 解决方法 方法一:双指针 方法二:递归 方法三:快慢指针 方法四:栈 第三题 题目来源 题目内容 解决方法…

Python实现查询一个文件中的pdf文件中的关键字

要求,查询一个文件中的pdf文件中的关键字,输出关键字所在PDF文件的文件名及对应的页数。 import os import PyPDF2def search_pdf_files(folder_path, keywords):# 初始化结果字典,以关键字为键,值为包含关键字的页面和文件名列表…

数据分析三剑客之一:Pandas详解

目录 1 Pandas介绍 2 Pandas的安装与导入 2.1 Pandas模块安装 2.2 Pandas模块导入 3 pandas数据结构及函数 3.1 Series结构 3.1.1 ndarray创建Series对象 3.1.2 dict创建Series对象 3.1.3 标量创建Series对象 3.1.4 位置索引访问Series数据 3.1.5 标签索引访问Series…