目录

简介

一、dbscan相关概念

二、dbscan的API

三、案例分析

1. 导入所需库

2. 数据读取与预处理

3. 数据准备

4. DBSCAN 参数调优

5. 确定最佳参数并应用

总结


简介

        本次我们将聚焦于一款极具特色的聚类算法 ——DBSCAN。相较于 K-means 等需要预先指定簇数量的算法,DBSCAN 以其 “无监督自适应” 的特性,在聚类领域占据着不可替代的地位。

        在这一课中,我们会深入剖析 DBSCAN 算法的核心原理。你将了解到它如何通过 “密度可达” 和 “核心对象” 等关键概念,自动发现数据集中任意形状的簇,还能识别出那些不属于任何簇的噪声点。这一特性让它在处理非凸形状、存在噪声的数据时,展现出远超传统聚类算法的优势。

一、dbscan相关概念

概念:
        基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并在噪声的空间数据集中发现任意形状的聚类。

  1. 核心对象:A 点在 DBSCAN 算法中,如果一个点的 E 邻域内包含的点的数量大于等于某个给定的阈值(MinPts) ,则这个点被称为核心对象。图中的 A 点就是核心对象,以 A 为圆心的红色圆圈代表其 E 邻域,可以看到在这个邻域内有足够多的其他点(超过了算法设定的阈值)。
  2. E 邻域:给定对象半径为 E 内的区域,对于给定的一个对象(点),以该对象为中心,半径为 E 的区域就是这个对象的 E 邻域。图中围绕每个点的圆圈就代表了相应点的 E 邻域,例如红色圆圈是核心对象 A 的 E 邻域,蓝色圆圈是点 N 的 E 邻域 ,黄色圆圈是点 B 和点 C 的 E 邻域。
  3. 直接密度可达:如果点 p 在点 q 的 E 邻域内,并且 q 是核心对象,那么我们称点 p 从点 q 直接密度可达。在图中,一些红色的点位于核心对象 A 的 E 邻域内,这些点就从 A 点直接密度可达。
  4. 密度可达:如果存在一个点链 p1, p2, ..., pn,其中 p1 = q,pn = p,对于 pi ∈ {p1, p2, ..., pn-1},pi+1 从 pi 直接密度可达,那么我们称点 p 从点 q 密度可达。例如图中,点 B 和点 C 虽然不在核心对象 A 的 E 邻域内,但可以通过一系列直接密度可达的点(图中的红色点链 ),从 A 点密度可达。
  5. 边界点:B 点、C 点边界点是指在其 E 邻域内有点属于某个簇,但自身不是核心对象的点。图中的 B 点和 C 点就是边界点,它们的 E 邻域(黄色圆圈 )内有来自核心对象 A 所在簇的点,但它们自身的 E 邻域内点数未达到成为核心对象的阈值。
  6. 离群点:N 点  离群点是指既不是核心对象也不是边界点的点,也就是不在任何簇中的点。

实现过程:

  1. 输入数据集
  2. 指定半径;
  3. 指定密度阈值;

二、dbscan的API

class 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:即图中提到的 “半径” ,DBSCAN 算法中定义的邻域半径。它决定了一个点的邻域范围,在这个范围内去判断点的密度情况,默认值 0.5
  • min_samples:可以理解为密度阈值相关,即构成核心点所需的邻域(eps 范围内)最少样本数量,用于判断核心对象,默认 5 。
  • metric:用于计算距离的度量方式,这里是 euclidean(欧几里得距离),也可选择其他距离度量,比如曼哈顿距离等,默认用欧氏距离衡量点与点之间的远近。
  • metric_params:度量函数的额外参数,一般用默认值 None 即可,当 metric 有特殊参数需求时才设置。
  • algorithm:近邻搜索算法,auto 表示让算法自动选择合适的近邻搜索方法(如 ball_treekd_tree 或 brute 等 ),根据数据情况自适应选择。
  • leaf_size:构建 BallTree 或 KDTree 时的叶子节点大小,会影响树构建和查询的效率,默认 30 。
  • p:当 metric 为闵可夫斯基距离(minkowski)时,p 是闵可夫斯基距离的阶数,p=2 就是欧氏距离,p=1 是曼哈顿距离;若 metric 不是闵可夫斯基距离,该参数无意义,默认 None 。
  • n_jobs:用于并行计算的 CPU 核心数,None 表示使用 1 个核心,-1 表示使用所有可用核心,可加速近邻搜索等过程。

三、案例分析

1. 导入所需库

import pandas as pd
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import adjusted_rand_score, normalized_mutual_info_score
import numpy as np

2. 数据读取与预处理

# 读取训练集和测试集数据
data_train = pd.read_csv("datingTestSet2.txt", sep='\t', encoding='utf-8', engine='python', header=None)
data_test = pd.read_csv("datingTestSet1.txt", sep='\t', encoding='utf-8', engine='python', header=None)# 初始化标准化器
scaler = StandardScaler()# 对特征列进行标准化(所有列除了最后一列,假设最后一列是标签)
data_train.iloc[:, :-1] = scaler.fit_transform(data_train.iloc[:, :-1])
data_test.iloc[:, :-1] = scaler.transform(data_test.iloc[:, :-1])
  • 标准化处理是 DBSCAN 等基于距离的算法必需的步骤,因为它对特征的尺度敏感
  • 测试集使用训练集的标准化参数,避免数据泄露

3. 数据准备

x_train = data_train.iloc[:, :-1]  # 训练集特征
x_test = data_test.iloc[:, :-1]    # 测试集特征
y_train_true = data_train.iloc[:, -1]  # 训练集真实标签
y_test_true = data_test.iloc[:, -1]    # 测试集真实标签

4. DBSCAN 参数调优

# 定义要测试的eps参数范围
scores = []
eps_param_range = [0.09, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6]for eps in eps_param_range:# 初始化并训练DBSCAN模型dbscan = DBSCAN(eps=eps, min_samples=2)train_labels = dbscan.fit_predict(x_train)# 计算评估指标,忽略噪声点(-1)mask = train_labels != -1if np.sum(mask) > 0:  # 确保有非噪声点ari = adjusted_rand_score(y_train_true[mask], train_labels[mask])nmi = normalized_mutual_info_score(y_train_true[mask], train_labels[mask])score_mean = (ari + nmi) / 2  # 平均得分scores.append(score_mean)print(f"eps等于{eps}的平均得分(ARI+NMI)/2为{score_mean:.4f}")else:print(f"eps等于{eps}时,所有样本都被标记为噪声点")scores.append(-1)
  • eps是 DBSCAN 中最重要的参数,定义了邻域半径
  • min_samples是构成核心点所需的最小样本数
  • 使用 ARI(调整兰德指数)和 NMI(标准化互信息)作为评估指标,这两个指标都需要真实标签
  • 忽略噪声点(标签为 - 1)对评估的影响

5. 确定最佳参数并应用

# 找到最佳的eps参数
best_eps = eps_param_range[np.argmax(scores)]
print(f"最好的eps是:{best_eps}")# 使用最佳参数重新训练模型
best_dbscan = DBSCAN(eps=best_eps, min_samples=2)
train_labels = best_dbscan.fit_predict(x_train)
print("训练集聚类标签:\n", train_labels)# 对测试集进行预测
test_labels = best_dbscan.fit_predict(x_test)
print("测试集聚类标签:\n", test_labels)
  • 选择平均得分最高的eps作为最佳参数
  • 使用最佳参数重新训练模型并输出聚类结果
  • 对测试集进行聚类并输出结果

总结

        这个案例我做的比较简单,重点是学习其代码的逻辑、这个代码框架可以作为 DBSCAN 算法应用的模板,只需根据实际数据集调整文件路径和参数范围即可。

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

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

相关文章

给AI开一副“健忘药”:Dropout如何治愈神经网络的死记硬背症

**——解读《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》**想象一位学生备考时,只反复背诵三套模拟题答案,却在真正的考场上面对新题型束手无策——这种**死记硬背不会举一反三**的问题,正是神经网络中的“过拟合”…

【框架】跨平台开发框架自用整理

Tauri 2.0 | Tauri https://github.com/tauri-apps/tauri 创建小型、快速、安全、跨平台的应用程序 独立于前端 将你现有的网络技术栈带到 Tauri 或开始新的项目。 Tauri 支持任何前端框架,所以你不需要改变你的技术栈。 跨平台 使用单个代码库为 Linux、macOS、W…

web前端第三次作业

一、作业要求&#xff1a;使用js完成抽奖项目 效果和内容自定义&#xff0c;可以模仿游戏抽奖页面二、代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthde…

wrap cpp variant as dll for c to use

包装c的variant给c用 variant_wrapper.cpp #include <variant> #include <unordered_map> #include <cstring> #include <cstdio> #include <new> #include <memory> #include <functional> #include <cstdlib>// 类型ID定义 …

GraphRAG查询(Query)流程实现原理分析

文章目录说明一 GraphRAG查询&#xff08;Query&#xff09;流程二 Local Search 实现原理三 Global Search 实现原理四 GraphRAG Python API使用说明 本文学自赋范社区公开课&#xff0c;仅供学习和交流使用&#xff01;本文重在介绍GraphRAG查询流程&#xff0c;有关索引构建…

服务器的安全检测和防御技术

1. 服务器安全风险1.1 不必要的访问&#xff08;如只提供HTTP服务&#xff09;若服务器仅需提供 HTTP 服务&#xff0c;却开放了其他不必要的访问途径&#xff0c;会增加风险。通过应用识别、控制&#xff0c;可精准识别应用类型&#xff0c;限制非必要访问&#xff0c;保障服务…

FileLink:为企业跨网文件传输筑牢安全与效率基石

FileLink&#xff1a;为企业跨网文件传输筑牢安全与效率基石在企业数据往来日益频繁的今天&#xff0c;跨网文件传输的安全性和高效性是企业顺畅运营的关键。传统传输方式在安全防护、系统融合及成本控制上的短板愈发明显&#xff0c;而 FileLink 凭借在这些方面的突出表现&…

java设计模式之开闭原则使用举例

1. 输入法皮肤扩展&#xff08;抽象类实现&#xff09; 场景&#xff1a;用户可为输入法更换不同皮肤&#xff08;如默认皮肤、CSDN皮肤&#xff09;。 实现&#xff1a; 抽象层&#xff1a;定义抽象类AbstractSkin&#xff0c;声明皮肤显示方法。扩展&#xff1a;新增皮肤只需…

Spark Shuffle机制原理

文章目录1.什么是Shuffle?2.Shuffle解决什么问题?3.Shuffle Write与Shuffle Read4.Shuffle的计算需求4.1 计算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架设计与实现5.1 Shuffle Write框架实现的功能5.2 Shuffle Write的多种情况5.…

Cursor vs Trae vs VSCode:2025终极IDE横评,谁才是开发者的效率之选?

前言 2025年的编程世界&#xff0c;AI不再只是辅助&#xff0c;而是编程工作流的核心驱动者。从微软的VSCode 到新锐 Cursor 与国产黑马 Trae &#xff0c;三大 IDE 正在重新定义“人机协作”的边界。本文从架构设计、AI能力、场景适配等维度&#xff0c;带你看透工具本质&…

Vue 安装指定版本依赖包、删除某个依赖包、依赖管理

如何安装指定版本的依赖包安装指定版本&#xff1a;一旦你知道了想要的版本号&#xff0c;比如3.4.0&#xff0c;你可以使用以下命令来安装这个版本的vue-router&#xff1a;npm install vue-router3.4.0 --save这里的^表示安装3.4.0的最新小版本更新&#xff0c;但不会超过主版…

psycopg2 如何验证链接是否有效

在 psycopg2 中&#xff0c;验证数据库连接是否有效&#xff08;即连接是否仍然活跃&#xff09;可以通过以下几种方法实现&#xff1a;1. 使用 conn.closed 属性 psycopg2 的连接对象有一个 closed 属性&#xff0c;可以检查连接是否已关闭&#xff1a; import psycopg2conn …

数据科学与计算-电商双11美妆数据分析

一、项目背景&#xff1a;双 11 美妆数据的价值所在 每年的 “双 11” 购物节都是电商行业的盛宴&#xff0c;而美妆品类作为消费热门领域&#xff0c;蕴含着丰富的用户行为与市场趋势信息。该项目聚焦双 11 期间的美妆电商数据&#xff0c;旨在通过数据分析揭示以下核心问题&…

简单了解MongoDB数据存储

官方文档&#xff1a;MongoDB中文手册|官方文档中文版 | MongoDB-CN-Manual 什么是MongoDB? MongnDB是一个分布式文件存储数据库(或叫文档数据库)&#xff0c;是一个介于 关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数…

web网站开发,在线%射击比赛成绩管理%系统开发demo,基于html,css,jquery,python,django,model,orm,mysql数据库

经验心得 这个也是crud业务单子&#xff0c;第二个聊点其他的&#xff0c;从最早的无分层开发&#xff0c;到三层开发&#xff0c;工厂&#xff0c;各种接口&#xff0c;再到后面多层&#xff0c;代码无痕aop&#xff0c;各种框架等&#xff0c;都是在方便我们快速打架一个程序…

[QtADS]解析ads.pro

本文来源 &#xff1a; 腾讯元宝subdirs : 子目录TEMPLATE subdirs的作用​​​​核心功能​​&#xff1a;声明当前项目为“多项目管理”模式。Qt 的构建系统&#xff08;qmake&#xff09;会遍历 SUBDIRS中列出的子目录&#xff0c;在每个子目录中寻找 .pro文件并递归构建。…

三方相机问题分析六:【没用相机,诡异的手电筒不可使用】下拉状态栏,手电筒置灰,无法打开,提提示相机正在使用

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 三方相机问题分析六:【没用相机,诡异的手电筒不可使用】下拉状态栏,点击手电筒,手电筒置灰,无法打开,提提示相机正在使用9348353 目录 一、问题背景 二、:问题分析过程 2.1:基于…

Java Selenium 自动打开浏览器保存截图

// 代码 public class ScreenshotExample {public static void main(String[] args) {// 1. 设置浏览器驱动路径&#xff08;根据实际路径修改&#xff09;System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");//…

新商机:为了减少辐射,可以用座机打机房中心再转手机

某些人痛恨自家附近有基站&#xff0c;说是辐射太大。你不能说人家迷信。一般解决办法就是拆基站。而我觉得&#xff0c;商机来了。现在座机基本没人装了。新商机就是座机。附近没有基站&#xff0c;又要打电话&#xff0c;怎么办&#xff1f;装座机。用座机打电话时&#xff0…

【Java|第十九篇】面向对象九——String类和枚举类

&#xff08;四&#xff09;面向对象11、String类&#xff08;1&#xff09;概述<1>String是一个类&#xff0c;引用数据类型&#xff0c;用来表示字符串&#xff1b;<2>String是Lang包下的类&#xff0c;使用不需要导包&#xff1b;<3>字符串的值不能变&…