机械学习--DBSCAN 算法(附实战案例)

DBSCAN 算法详解

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,带噪声的基于密度的空间聚类应用)是一种经典的密度聚类算法,由 Martin Ester 等人于 1996 年提出。与 K-means 等基于距离的聚类算法不同,DBSCAN 通过数据点的局部密度来划分簇,能够发现任意形状的簇并自动识别噪声点,在空间数据挖掘、异常检测等领域有广泛应用。

一、核心思想

DBSCAN 的核心思想是:“簇是由足够密集的点组成的连续区域,而簇之外的点被视为噪声”。具体来说:

  • 若一个区域内的点密度高于某个阈值,则该区域被划分为一个簇;
  • 密度低于阈值的点被标记为噪声(异常点);
  • 无需预先指定簇的数量,簇的数量由数据本身的密度分布自动决定。

二、关键概念

理解 DBSCAN 需先掌握以下核心概念,这些概念是算法聚类逻辑的基础:

1. 核心参数

  • ε(Epsilon,半径):定义 “邻域” 的范围,即一个点的 ε 邻域是指以该点为中心、半径为 ε 的区域(在欧氏空间中为球体,高维空间中为超球体)。
  • MinPts(最小点数):定义 “密集区域” 的阈值,即一个点的 ε 邻域内至少包含 MinPts 个点(包括该点自身),才能认为该区域是密集的。

2. 点的类型

基于 ε 和 MinPts,数据集中的点可分为三类:

  • 核心点(Core Point):若一个点的 ε 邻域内包含至少 MinPts 个点(包括自身),则该点为核心点。核心点是簇的 “种子”,代表密集区域的中心。
    例:若 ε=2,MinPts=5,点 p 的 ε 邻域内有 6 个点(含 p),则 p 是核心点。

  • 边界点(Border Point):若一个点的 ε 邻域内包含的点数小于 MinPts,但该点落在某个核心点的 ε 邻域内,则该点为边界点。边界点属于某个簇,但自身不构成密集区域。
    例:点 q 的 ε 邻域内有 3 个点(<MinPts=5),但 q 在核心点 p 的 ε 邻域内,则 q 是边界点,属于 p 所在的簇。

  • 噪声点(Noise Point):既不是核心点,也不在任何核心点的 ε 邻域内的点,被视为噪声(异常点)。
    例:点 r 的 ε 邻域内只有 2 个点(<MinPts=5),且没有任何核心点的 ε 邻域包含 r,则 r 是噪声点。

3. 密度关系

DBSCAN 通过 “密度可达” 和 “密度相连” 定义簇的结构:

  • 密度可达(Density-Reachable):若存在一条点链 p1​,p2​,...,pk​,其中 p1​=p,pk​=q,且每个 pi​ 都是核心点,且 pi+1​ 在 pi​ 的 ε 邻域内,则称 q 从 p 密度可达。
  • 密度相连(Density-Connected):若存在一个核心点 o,使得 p 和 q 都从 o 密度可达,则称 p 和 q 密度相连。

簇的定义:由所有相互密度相连的点(核心点 + 边界点)组成的最大集合,噪声点不属于任何簇。

三、聚类步骤

DBSCAN 的聚类过程可概括为 “遍历 - 扩展 - 标记” 三个阶段,具体步骤如下:

  1. 初始化:将所有点标记为 “未访问”;初始化簇计数器 C=0。

  2. 遍历未访问点
    从数据集中随机选择一个未访问的点 p,标记为 “已访问”。

  3. 判断点类型并扩展簇

    • 若 p 是核心点:
      • 新建一个簇 C,将 p 加入簇 C;
      • 收集 p 的 ε 邻域内所有未访问的点,放入队列;
      • 对队列中的每个点 q:
        • 标记 q 为 “已访问”;
        • 若 q 是核心点,将其 ε 邻域内未加入簇的点加入队列;
        • 将 q 加入簇 C;
      • 簇 C 扩展完成,簇计数器 C+=1。
    • 若 p 是边界点:
      • 暂时不分配簇,等待被其所属的核心点的簇包含(边界点的簇归属由第一个发现它的核心点决定)。
    • 若 p 是噪声点:
      • 标记为噪声(通常用 - 1 表示),不分配簇。
  4. 重复步骤 2-3:直到所有点都被访问,聚类结束。

四、参数选择

DBSCAN 的性能高度依赖于参数 ε 和 MinPts 的选择,以下是常用的参数调优方法:

1. MinPts 的选择

MinPts 的取值通常与数据维度相关,经验规则为:

  • 对于二维数据,MinPts 一般取 4-8;
  • 对于高维数据(维度为 d),MinPts 建议至少为 d+1(确保能形成 “密集区域” 的最小点数)。

2. ε 的选择

ε 的选择需结合数据的密度分布,常用方法是k - 距离图(k-distance graph)

  • 对每个点,计算它到第 k 个最近邻点的距离(k 通常取 MinPts-1);
  • 将所有点的 k - 距离按升序排序,绘制 k - 距离图(横轴为点序号,纵轴为 k - 距离);
  • 图中 “拐点” 对应的距离即为最佳 ε—— 拐点前距离增长缓慢(密集区域),拐点后距离快速增长(进入稀疏区域)。

例:若 k=3(MinPts=4),k - 距离图在距离 = 2.5 处出现明显拐点,则 ε=2.5。

五、优缺点分析

优点

  1. 无需预先指定簇数量:簇的数量由数据密度自动决定,避免了 K-means 中 k 值难调的问题。
  2. 能发现任意形状的簇:不受簇形状限制,可识别非球形簇(如环形、条形)。
  3. 抗噪声能力强:可直接标记噪声点,适合含异常值的数据。
  4. 对数据库友好:若使用空间索引(如 R 树),时间复杂度可降至 O(nlogn)(n 为样本量)。

缺点

  1. 参数敏感:ε 和 MinPts 的微小变化可能导致聚类结果差异很大,参数调优难度高。
  2. 高维数据效果差:高维空间中距离度量(如欧氏距离)的区分度下降,难以定义 “密度”。
  3. 对密度不均匀数据不友好:若数据中不同簇的密度差异大,难以找到适用于所有簇的 ε 和 MinPts。
  4. 边界点归属模糊:边界点可能被分配给第一个发现它的核心点的簇,导致簇归属不唯一。
  5. 时间复杂度较高:最坏情况下时间复杂度为 O(n2)(无空间索引时),不适合超大规模数据。

六、应用场景

DBSCAN 适用于低密度、形状不规则且含噪声的数据,典型应用包括:

  • 空间数据聚类:如城市 POI(兴趣点)聚类、GPS 轨迹聚类(识别热门路线)。
  • 异常检测:如信用卡欺诈检测(噪声点对应异常交易)、设备故障检测。
  • 图像处理:如目标分割(从背景中聚类出前景目标)。
  • 文本聚类:结合 TF-IDF 等特征,对主题相近的文本进行聚类(需注意高维问题)。

七、与其他聚类算法对比

算法核心思想优点缺点适用场景
DBSCAN密度聚类任意形状簇、抗噪声、无需指定 k参数敏感、高维效果差低密度、非球形簇、含噪声数据
K-means距离聚类效率高、适合大规模数据需指定 k、仅球形簇、对噪声敏感低维、球形簇、无噪声数据
层次聚类层次合并 / 分裂可生成聚类树、无需指定 k计算复杂度高、对噪声敏感小规模数据、需层次关系分析

DBSCAN 算法实战:啤酒数据聚类分析

一、数据背景与目标

本文档数据包含 20 种啤酒的 4 项特征:热量(calories)、钠含量(sodium)、酒精含量(alcohol)和成本(cost),数据格式如下

namecaloriessodiumalcoholcost
Budweiser144154.70.43
Schlitz151194.90.43
...(共 20 条数据)............

目标:使用 DBSCAN 算法基于啤酒的理化特征和成本进行聚类,探索啤酒之间的内在分组规律,并识别可能的 “异常啤酒”(噪声点)。

二、实战步骤

1. 数据预处理

(1)数据加载与查看

首先导入必要的库并加载数据:

import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
from sklearn.cluster import DBSCAN  
from sklearn.preprocessing import StandardScaler  
from sklearn.neighbors import NearestNeighbors  # 加载数据  
data = pd.DataFrame([  ["Budweiser", 144, 15, 4.7, 0.43],  ["Schlitz", 151, 19, 4.9, 0.43],  ["Lowenbrau", 157, 15, 0.9, 0.48],  ["Kronenbourg", 170, 7, 5.2, 0.73],  ["Heineken", 152, 11, 5.0, 0.77],  ["Old_Milwaukee", 145, 23, 4.6, 0.28],  ["Augsberger", 175, 24, 5.5, 0.40],  ["Srohs_Bohemian_Style", 149, 27, 4.7, 0.42],  ["Miller_Lite", 99, 10, 4.3, 0.43],  ["Budweiser_Light", 113, 8, 3.7, 0.40],  ["Coors", 140, 18, 4.6, 0.44],  ["Coors_Light", 102, 15, 4.1, 0.46],  ["Michelob_Light", 135, 11, 4.2, 0.50],  ["Becks", 150, 19, 4.7, 0.76],  ["Kirin", 149, 6, 5.0, 0.79],  ["Pabst_Extra_Light", 68, 15, 2.3, 0.38],  ["Hamms", 139, 19, 4.4, 0.43],  ["Heilemans_Old_Style", 144, 24, 4.9, 0.43],  ["Olympia_Goled_Light", 72, 6, 2.9, 0.46],  ["Schlitz_Light", 97, 7, 4.2, 0.47]  
], columns=["name", "calories", "sodium", "alcohol", "cost"])  # 提取特征数据(排除名称列)  
X = data[["calories", "sodium", "alcohol", "cost"]]  
(2)数据标准化

DBSCAN 基于距离计算密度,需对特征进行标准化(消除量纲影响):

# 标准化特征(均值为0,方差为1)  
scaler = StandardScaler()  
X_scaled = scaler.fit_transform(X)  

2. 参数选择(ε 和 MinPts)

(1)确定 MinPts

数据维度为 4(calories、sodium、alcohol、cost),根据经验规则,MinPts 建议取 d+1=5(d 为维度)。

(2)确定 ε:k - 距离图法

通过 k - 距离图找 “拐点”,k 取 MinPts-1=4:

# 计算每个点到第4个最近邻的距离  
neighbors = NearestNeighbors(n_neighbors=4)  
neighbors_fit = neighbors.fit(X_scaled)  
distances, indices = neighbors_fit.kneighbors(X_scaled)  # 排序距离并绘图  
distances = np.sort(distances[:, 3], axis=0)  # 取第4个最近邻的距离  
plt.plot(distances)  
plt.title("k-distance Graph (k=4)")  
plt.xlabel("Point Index")  
plt.ylabel("4th Neighbor Distance")  
plt.grid(True)  
plt.show()  

结果分析:k - 距离图在距离≈0.6 处出现明显拐点,因此选择 ε=0.6。

3. 执行 DBSCAN 聚类

# 初始化DBSCAN模型  
dbscan = DBSCAN(eps=0.6, min_samples=5)  # ε=0.6,MinPts=5  
clusters = dbscan.fit_predict(X_scaled)  # 将聚类结果添加到原数据  
data["cluster"] = clusters  
print("聚类结果:")  
print(data[["name", "cluster"]].sort_values(by="cluster"))  

4. 聚类结果分析

(1)结果概览

聚类结果如下(-1 表示噪声点):

namecluster
Budweiser0
Schlitz0
Old_Milwaukee0
Srohs_Bohemian_Style0
Coors0
Hamms0
Heilemans_Old_Style0
Miller_Lite1
Budweiser_Light1
Coors_Light1
Michelob_Light1
Schlitz_Light1
Kronenbourg2
Heineken2
Becks2
Kirin2
Lowenbrau-1
Augsberger-1
Pabst_Extra_Light-1
Olympia_Goled_Light-1
(2)簇解读
  • 簇 0(常规啤酒):共 7 种啤酒,热量中等(139-151)、酒精含量 4.4-4.9%、成本较低(0.28-0.44),钠含量偏高(15-27),适合大众日常消费。
  • 簇 1(轻量啤酒):共 6 种啤酒,热量较低(97-135)、酒精含量 3.7-4.3%、成本中等(0.40-0.50),钠含量适中(7-15),主打低热量健康概念。
  • 簇 2(进口 / 高端啤酒):共 4 种啤酒(Kronenbourg、Heineken 等),热量较高(149-170)、酒精含量 5.0-5.2%、成本高(0.73-0.79),钠含量低(6-19),定位高端市场。
  • 噪声点(异常啤酒)
    • Lowenbrau:酒精含量仅 0.9%(远低于其他啤酒),可能是无醇啤酒;
    • Augsberger:热量最高(175)、钠含量高(24),但成本中等(0.40),特征独特;
    • Pabst_Extra_Light 和 Olympia_Goled_Light:热量极低(68-72)、酒精含量仅 2.3-2.9%,可能是超轻量啤酒或特殊品类。

5. 可视化聚类结果

使用 PCA 降维至 2D 可视化(保留主要特征):

from sklearn.decomposition import PCA  # PCA降维  
pca = PCA(n_components=2)  
X_pca = pca.fit_transform(X_scaled)  # 绘图  
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=data["cluster"], cmap="viridis", label=data["cluster"])  
for i, name in enumerate(data["name"]):  plt.annotate(name, (X_pca[i, 0], X_pca[i, 1]), fontsize=8)  
plt.title("DBSCAN Clustering Result (PCA 2D)")  
plt.xlabel("PCA Component 1")  
plt.ylabel("PCA Component 2")  
plt.legend(title="Cluster")  
plt.show()  

可视化结论:三个簇在空间中明显分离,噪声点远离密集区域,验证了聚类结果的合理性。

三、总结

  1. 聚类效果:DBSCAN 成功将啤酒分为 3 个有意义的簇(常规啤酒、轻量啤酒、高端啤酒),并识别出 4 种特征异常的啤酒(噪声点),符合实际产品分类逻辑。
  2. 参数影响:ε=0.6 和 MinPts=5 的组合效果较好,若 ε 增大,可能将噪声点划入簇;若 MinPts 增大,可能导致簇分裂为更多小簇。
  3. 应用价值:该结果可辅助啤酒企业定位产品市场、优化产品线,或为消费者提供基于特征的选购参考。

通过本案例可见,DBSCAN 在小样本、多特征的消费数据聚类中能有效挖掘潜在分组,且无需预先指定簇数量,是探索性数据分析的有力工具。

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

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

相关文章

【昇腾】基于RK3588 arm架构Ubuntu22.04系统上适配Atlas 200I A2加速模块安装EP模式下的驱动固件包_20250808

一、背景 1.1 主要的硬件是&#xff1a;1.2 主要的软件是&#xff1a; RK3588跑操作系统Atlas 200I A2加速模块作为EP模式关键参数版本说明CPU架构aarch64OS版本Ubuntu 22.04.5 LTSkernel版本5.10.198 二、适配 准备固件run包文件&#xff1a;Ascend-hdk-310b-npu-firmware_7.…

如何在 VS Code 中进行 `cherry-pick`

cherry-pick 是 Git 的一个功能&#xff0c;允许你选择某个 commit 并将其应用到当前分支&#xff0c;而无需合并整个分支。在 VS Code 中&#xff0c;你可以通过 内置的 Git 功能 或 终端 来完成 cherry-pick。方法 1&#xff1a;使用 VS Code 的 Git 图形界面&#xff08;GUI…

STM32CubeMX(十三)FatFs文件系统(SPI驱动W25Qxx)

目录 一、知识点 1. 什么是Fatfs文件系统? 2. Fatfs操作系统控制流程 二、实战操作 1.CubeMX配置 2. 配置串口以及SPI 3. 修改功能映射接口 4. 添加测试代码 5. 实验现象 在完成本章之前需要完成一些基础配置,详情查看下面的文章。 STM32CubeMX(二)新建工…

【前端后端部署】将前后端项目部署到云服务器

更多笔记在这里☞ 全栈之路&#xff1a; https://gitee.com/oldbe/notes 【跳转到】 觉得有用请点个 star &#xff0c;非常感谢&#xff01; 现在AI太强大&#xff0c;开发个人产品的门槛和成本太低了&#xff0c;只要你有好的想法都可以很快速的开发一款产品 1.…

vue如何监听localstorage

在Vue中监听localStorage的变化可以通过几种方式实现&#xff0c;但需要注意的是&#xff0c;localStorage本身不提供原生的事件监听机制&#xff0c;如DOM元素的MutationObserver。不过&#xff0c;你可以通过一些间接的方法来监听localStorage的变化。方法1&#xff1a;使用w…

灰狼算法+四模型对比!GWO-CNN-LSTM-Attention系列四模型多变量时序预测

摘要&#xff1a;聚划算&#xff01;大对比&#xff01;灰狼算法四模型对比&#xff01;GWO-CNN-LSTM-Attention系列四模型多变量时序预测&#xff0c;该代码特别适合需要横向对比不同深度学习模型性能的时序预测场景&#xff0c;研究者可通过参数快速适配不同预测需求&#xf…

冒泡排序实现以及优化

一&#xff0c;冒泡排序说明冒泡排序是从第一个元素开始和后面一个元素进行判断是否满足左小右大&#xff0c;如果不满足就交换位置&#xff0c;再拿第二个和第三个进行上述操作一直到第n-1和第n个。经过上述的一轮操作就可以把第一个最大值放到最右边&#xff0c;在进行n轮上述…

水下管道巡检机器人cad【10张】三维图+设计说明书

摘 要 水下管道是水下油气管道的生命线&#xff0c;水下管道巡检机器人可以替代人工完成水下油气管道状态的实时监测和数据反馈&#xff0c;有助于工作人员对水下油气管道的运行情况实时掌握。 本文完成了水下管道巡检机器人的总体设计&#xff0c;采用三维设计软件Solidwor…

SQL(结构化查询语言)的四大核心分类

这张图展示了 SQL&#xff08;结构化查询语言&#xff09;的四大核心分类&#xff0c;分别对应不同的数据库操作场景。以下是逐类解析&#xff1a;1. 数据操作语言&#xff08;DML&#xff1a;Data Manipulation Language&#xff09;作用&#xff1a;用于操作数据库中的数据&a…

AI(1)-神经网络(正向传播与反向传播)

&#x1f34b;&#x1f34b;AI学习&#x1f34b;&#x1f34b;&#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主…

嵌入式Linux学习 - 数据结构6

五、哈希表1. 哈希算法将数据通过哈希算法映射成一个键值&#xff0c;存取都在同一位置实现数据的高效存储和查找将时间复杂度尽可能降低至O(1)2. 哈希碰撞多个数据通过哈希算法得到的键值相同&#xff0c;称为产生哈希碰撞3. 哈希表构建哈希表存放0-100之间的数据将0 - 100之间…

GitHub 趋势日报 (2025年08月07日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1894nautilus_trader354stagehand315openai-cookbook263sim242ollama230prisma154v…

android 使用openimagelib OpenImage 实现点击放大图片,浏览

在 Android 中使用 OpenImageLib(假设这是一个开源图片加载库,类似于 Glide 或 Picasso)实现 点击放大图片并浏览 的功能,通常需要结合 图片查看器库(如 PhotoView)和 图片加载库(如 OpenImageLib)。以下是完整的实现方案: 1. 添加依赖 (1) 添加 OpenImageLib 依赖 …

计算机视觉CS231n学习(4)

深度学习软件 &#xff08;这一部分去看tensorflow和pytorch的笔记&#xff09; &#xff08;见专栏&#xff09;tensorflow和pytorch区别 tensorflow&#xff0c;我们先构建显示的图&#xff0c;然后重复运行它 pytorch&#xff0c;我们每次做前向传播时&#xff0c;都构建一个…

【具身智能】具身智能的革命——人形机器人如何重塑人类日常生活

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 2025年被誉为具身智能的元年,人形机器人技术迅猛发展,将深刻改变人类生活方式。本文从具身智能的核心概念入手,探讨人形机器人的硬件架构、感知系统、运动控制和决策算法等技术基础。结合…

Jira Service Management企业服务管理:IT、HR、法务、财务等部门如何落地现代企业服务管理理念与实践

Jira Service Management 服务管理方法Jira Service Management 服务管理方法将开发、IT运营和业务团队整合至一个统一平台&#xff0c;以实现更高效的协作。任何团队都能够快速响应业务变化&#xff0c;为客户和员工提供卓越体验。Jira Service Management 提供直观、经济高效…

软件开发 - danger 与 dangerous、warn 与 warning

danger 与 dangerous 1、danger词性&#xff1a;n.含义&#xff1a;指可能造成伤害或损失的情况或事物# 例词in 【danger】&#xff08;处于危险中&#xff09; out of 【danger】&#xff08;脱离危险&#xff09;# 例句After the surgery, the doctor said the patient was o…

为何毫米波需要采用不同的DPD方法?如何量化其值?

摘要 在5G新无线电技术标准中&#xff0c;除了sub-6 GHz频率外&#xff0c;还利用毫米波(mmWave)频率来提高吞吐量。毫米波频率的使用为大幅提高数据吞吐量带来了独特的机会&#xff0c;同时也带来了新的实施挑战。本文探讨sub-6 GHz和毫米波基站无线电之间的架构差异&#xff…

【数据结构入门】栈和队列的OJ题

目录 1. 有效的括号 分析&#xff1a; 代码&#xff1a; 2. 用队列实现栈 分析&#xff1a; 代码&#xff1a; 3. 用栈实现队列 分析&#xff1a; 代码&#xff1a; 4. 设计循环队列 思路&#xff1a; 代码&#xff1a; 定义循环队列结构体&#xff1a; 初始化结…

#Datawhale AI夏令营#第三期全球AI攻防挑战赛(AIGC技术-图像方向)

本次题目来源于Datawhale AI夏令营第三期全球AI攻防挑战赛图像生成赛道。首先看一下赛题背景和要求。1.赛题相关大赛背景随着大模型&#xff08;Deepseek、GPT、LLaMA等&#xff09;的爆发式应用&#xff0c;AI技术已深度融入金融、医疗、智能终端语音交互场等核心领域&#xf…