在 Python 中实现 DBSCAN

news2024/12/24 9:41:08

一、说明

        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/1006545.html

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

相关文章

MacVim for Mac:强大的文本编辑器,提升你的编程体验

在Mac上,有这样一款独特的文本编辑器——MacVim for Mac,它以其强大的功能和出色的性能,吸引了广大的程序员和编程爱好者。这款编辑器不仅继承了Unix编辑器Vi的强大功能,更通过创新的设计和功能拓展,提供了一款更完整、…

批量上传文件,以input上传文件,后端以List<MultipartFile>类型接收

批量上传文件,以input上传文件,后端以List类型接收 一、后端接口二、前端对接三、测试 最近公司要求要做一个批量上传文件的功能,以往做的导入Excel表格、上传图片都是上传一个文件的,此次在开发的过程中着实让我犯了难&#xff0…

vue Echarts饼图指定颜色与数据对应

需求:一般自定义颜色是按照数据的顺序依次对应,现在想要指定字段对应某个颜色 因为是直接在返回数据中做操作,所以直接写这部分的代码 数据格式 cdata: {xData: ["水文", "森林", "气象", "地质",…

学习笔记|外部中断|INT0|中断列表|STC32G单片机视频开发教程(冲哥)|第十五集:中断系统和外部中断

文章目录 1.中断和中断系统1.1什么是中断?1.2什么是中断系统1.3中断系统的优点1.4 中断系统包含哪些中断源1.5.中断次序 2.什么是外部中断3.外部中断的用法4.外部中断的用法完整代码 总结课后练习: 上节课我们学完了GPIO的矩阵按键,已经把这个GPIO的一个外设全都已…

最小二乘法的实现与线性回归的应用

1. 简介 简单线性回归中,您有一个因变量y和一个自变量X。该模型可以表示为: y m x b ymxb ymxb 其中 x x x: 自变量 y y y: 因变量 m m m: 斜率 b b b: 截距 最小二乘法是回归分析中用于估计线性回归模型参数的标准方法。它可以最小化误差的平方和&…

SpringBoot课堂笔记20230913

本篇文章为SpringBoot学习笔记,方便自己再复习。 Maven:jar包管理工具 注解: Controller:处理http请求,返回的视图 RestController: 相当于ResponseBody和Controller一起用,返回的是json ResponseBody:返回响应内容 …

客户关系管理的定义及三种常见的CRM系统

CRM旨在加强企业与客户的关系,建立以客户为中心的经营策略。随着技术的迅速发展,CRM的实施变得更加普遍,不仅能帮助企业与客户建立紧密联系,还能实现客户细分开展个性化的营销活动。客户关系管理是什么,CRM怎么分&…

【MySQL】数据库的操作

目录 前言 创建数据库 编码集和校验集 不同校验集的区别 删除数据库 确认当前数据库 查看数据库属性 修改数据库属性 备份与还原 数据库和表的备份 还原 创建表 查看列结构 查看表属性 修改表的列 修改表名称 修改列名称 删除表 前言 在上一篇文章中&#…

什么是生成对抗网络 (GAN)?

什么是生成对抗网络 (GAN)? 钦吉兹赛义德贝利 一、说明 GAN(Generative Adversarial Network)网络是一种深度学习模型,由两个神经网络——生成器和判别器组成。生成器负责生成虚假的数据,而判别…

Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)

Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等) 准备文件,这里我放在resource下的templates路径 在pom中配置构建打包的资源,更新maven 如果使用了assembly打包插件这样配置可能仍不生效&#…

Windows+Pycharm 如何创建虚拟环境

当我们开发一个别人的项目的时候,因为项目里有很多特有的包,比如 Pyqt5.我们不想破坏电脑上原来的包版本,这个时候,新建一个虚拟环境,专门针对这个项目就很有必要了. 简略步骤: 1.新建虚拟环境 1.打开 pycharm 终端(Terminal)安装虚拟环境工具: pip install virtualenv2.创…

基于FPGA的图像指数对比度增强算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1图像指数对比度增强概述 4.2基于FPGA的图像指数对比度增强 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 Vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns…

Redis——渐进式遍历和数据库管理命令

介绍 如果使用keys * 这样的操作,将Redis中所有的key都获取到,由于Redis是单线程工作,这个操作本身又要消耗很多时间,那么就会导致Redis服务器阻塞,后续的操作无法正常执行 而渐进式遍历,通过多次执行遍历…

虹科展会丨9月19号工博会启航:虹科五大团队携20+产品,双展台+两场演讲等您来!

2023年9月19-23日,第23届中国国际工业博览会即将在上海国家会展中心拉开帷幕。本届工博会以“碳循新工业、数聚新经济”为主题,展览面积30万平方米,吸引了来自全球27个国家和地区超2600家企业参展,共设置九大专业展区,…

电子游戏冷知识

电子游戏一直在试图用技术还原一个真实或虚幻的世界,并在其中演绎和倾诉人类种种的情感和欲望。 对信息技术发展的贡献 游戏推动了芯片、网络、VR/AR等领域的技术进步和创新。根据中科院的研究报告,游戏技术对芯片产业的科技进步贡献率是14.9%&#xff…

清华大学LightGrad-TTS,且流式实现

论文链接: https://arxiv.org/abs/2308.16569 代码地址: https://github.com/thuhcsi/LightGrad 数据支持: 针对BZNSYP和LJSpeech提供训练脚本 针对Grad-TTS提出两个问题: DPMs are not lightweight enough for resource-con…

真空腔体的设计要点

真空腔体是保持内部为真空状态的容器,真空腔体设计制作要考虑容积、材质和形状。 1、根据应用需求选择腔体形状。几种代表性的真空腔体包括垂直真空腔体、水平真空腔体、立方真空腔体和球形真空腔体。 2、根据获得真空度选择腔体材质。钛用于极高真空;…

轻松学习 Spring 事务

文章目录 一. Spring事务简介二. Spring事务使用1. 编程式事务2. 声明式事务 三. Transactional的使用1. 参数作用2. 事务失效的场景3. Transactional工作原理 四. Spring 事务的隔离级别五. Spring事务传播机制 一. Spring事务简介 在之前的博客已经介绍了在 Spring 环境中整…

《向量数据库指南》——Milvus Cloud是如何从 0 到 1 做一款向量数据库的?经过了哪些升级和迭代?

这实际上是一个颇具曲折性和难得性的故事。由于我自己是在公司中间加入的,从 2.0 版本开始参与了 Milvus 的构建,而我们公司在向量数据库领域已经有大约 5 年的历史了。 最初,我们看到了这个机会,并意识到有诸如 Faiss 等引擎在处…

文件属性操作函数

1.access函数 #include <unistd.h> int access(const char *pathname, int mode); 作用&#xff1a;判断某个文件是否有某个权限&#xff0c;或者判断文件是否存在 参数: -pathname:判断的文件路径 -mode: R_OK&#xff1a;判断是否有读权限 W_OK X_OK F_OK&#xff1a;…