【机器学习】DBSCAN聚类算法——原理、参数调优与实战 DBSCAN聚类算法从原理到参数调优实战简介一、DBSCAN 相关概念核心概念图解核心术语详解算法实现流程二、DBSCAN 的 API核心参数说明三、案例分析1. 导入所需库2. 数据读取与标准化3. 数据准备4. DBSCAN 参数调优5. 确定最佳参数并输出结果总结关键参数调优建议简介本次我们将聚焦于一款极具特色的聚类算法——DBSCAN。相较于 K-means 等需要预先指定簇数量的算法DBSCAN 以其无监督自适应的特性在聚类领域占据着不可替代的地位。在这一课中我们会深入剖析 DBSCAN 算法的核心原理。你将了解到它如何通过密度可达和核心对象等关键概念自动发现数据集中任意形状的簇还能识别出那些不属于任何簇的噪声点。这一特性让它在处理非凸形状、存在噪声的数据时展现出远超传统聚类算法的优势。一、DBSCAN 相关概念核心概念图解DBSCANDensity-Based Spatial Clustering of Applications with Noise是一种基于密度的空间聚类算法。它将簇定义为密度相连的点的最大集合能够将具有足够高密度的区域划分为簇并在噪声数据中发现任意形状的聚类。核心术语详解术语定义核心对象Core Point如果某个点的 Eps 邻域内包含的样本数量 ≥ MinPts则该点为核心对象Eps 邻域给定对象半径 Eps 内的区域即以该点为中心、Eps 为半径的圆形区域直接密度可达如果点 p 在点 q 的 Eps 邻域内且 q 是核心对象则称 p 从 q 直接密度可达密度可达存在一个点链 p₁, p₂, …, pₙ使得每个点都从上一个点直接密度可达边界点Border Point在某个簇内但自身不是核心对象的点离群点Outlier / Noise既不是核心对象也不是边界点不属于任何簇的点算法实现流程输入数据集指定半径 Eps指定密度阈值 MinPts遍历所有点标记核心对象对每个核心对象找出其密度可达的所有点形成簇将不在任何簇中的点标记为噪声二、DBSCAN 的 APIclasssklearn.cluster.DBSCAN(eps0.5,min_samples5,metriceuclidean,metric_paramsNone,algorithmauto,leaf_size30,pNone,n_jobsNone)核心参数说明参数说明eps邻域半径决定了一个点的邻域范围默认 0.5min_samples构成核心点所需的最少样本数密度阈值默认 5metric距离度量方式默认 ‘euclidean’欧氏距离metric_params度量函数的额外参数默认 Nonealgorithm近邻搜索算法‘auto’ 表示自动选择ball_tree / kd_tree / bruteleaf_size构建 BallTree 或 KDTree 时的叶子节点大小默认 30p闵可夫斯基距离的阶数p2 为欧氏距离p1 为曼哈顿距离n_jobs并行计算的 CPU 核心数-1 表示使用所有核心三、案例分析1. 导入所需库importpandasaspdfromsklearn.clusterimportDBSCANfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportadjusted_rand_score,normalized_mutual_info_scoreimportnumpyasnp2. 数据读取与标准化# 读取训练集和测试集数据data_trainpd.read_csv(datingTestSet2.txt,sep\t,encodingutf-8,enginepython,headerNone)data_testpd.read_csv(datingTestSet1.txt,sep\t,encodingutf-8,enginepython,headerNone)# 标准化处理DBSCAN 基于距离必须进行标准化scalerStandardScaler()data_train.iloc[:,:-1]scaler.fit_transform(data_train.iloc[:,:-1])data_test.iloc[:,:-1]scaler.transform(data_test.iloc[:,:-1])3. 数据准备x_traindata_train.iloc[:,:-1]# 训练集特征x_testdata_test.iloc[:,:-1]# 测试集特征y_train_truedata_train.iloc[:,-1]# 训练集真实标签y_test_truedata_test.iloc[:,-1]# 测试集真实标签4. DBSCAN 参数调优# 测试不同的 eps 参数scores[]eps_param_range[0.09,0.1,0.2,0.3,0.4,0.5,0.6]forepsineps_param_range:dbscanDBSCAN(epseps,min_samples2)train_labelsdbscan.fit_predict(x_train)# 忽略噪声点标签为 -1进行评估masktrain_labels!-1ifnp.sum(mask)0:ariadjusted_rand_score(y_train_true[mask],train_labels[mask])nminormalized_mutual_info_score(y_train_true[mask],train_labels[mask])score_mean(arinmi)/2scores.append(score_mean)print(feps {eps}平均得分 (ARINMI)/2 {score_mean:.4f})else:print(feps {eps}所有样本均被标记为噪声)scores.append(-1)5. 确定最佳参数并输出结果# 选择最佳 epsbest_epseps_param_range[np.argmax(scores)]print(f最优 eps 参数{best_eps})# 使用最佳参数重新训练best_dbscanDBSCAN(epsbest_eps,min_samples2)train_labelsbest_dbscan.fit_predict(x_train)print(训练集聚类标签\n,train_labels)# 对测试集进行聚类test_labelsbest_dbscan.fit_predict(x_test)print(测试集聚类标签\n,test_labels)总结DBSCAN 的优势无需预先指定簇数量自动发现数据中的聚类结构可发现任意形状的簇不同于 K-means 只能发现球形簇具有噪声过滤能力能自动识别并剔除离群点关键参数调优建议参数调优方法eps使用 k-distance 图辅助确定或通过网格搜索结合评估指标选择min_samples一般取数据维度的 2 倍或更大数据量较大时可适当增加

相关新闻

最新新闻

编程实现三大经典数学问题:调和级数、排列数与亲和数

编程实现三大经典数学问题:调和级数、排列数与亲和数

1. 项目概述:三组经典数学问题的编程实现今天要分享的是三个看似简单却蕴含数学美感的编程题目:倒数数列求和、排列数计算和亲和数判断。这三个问题分别来自数列、组合数学和数论领域,虽然标注为"易",但在实际编程实现中…

2026/8/3 4:43:12
【导弹】多导弹协同模拟【含Matlab源码 15916期】

【导弹】多导弹协同模拟【含Matlab源码 15916期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…

2026/8/3 4:43:12
如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生

如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生

如何自动批量下载同步歌词?LRCGET让你的离线音乐库焕发新生 【免费下载链接】lrcget Utility for mass-downloading LRC synced lyrics for your offline music library. 项目地址: https://gitcode.com/gh_mirrors/lr/lrcget 你是否曾为本地音乐文件缺少歌词…

2026/8/3 4:43:12
嵌入式系统开发入门:从硬件到软件的完整指南

嵌入式系统开发入门:从硬件到软件的完整指南

1. 嵌入式系统入门:从零开始构建智能硬件开发能力作为一名在嵌入式领域摸爬滚打十年的工程师,我经常被问到"如何系统学习嵌入式开发"。这个看似简单的命题背后,其实包含硬件设计、固件编程、实时系统、外设驱动等复杂知识体系。今天…

2026/8/3 4:43:12
微信小程序Canvas层级问题终极解决方案:覆盖交互与性能优化

微信小程序Canvas层级问题终极解决方案:覆盖交互与性能优化

1. 问题缘起:当Canvas盖住了一切做微信小程序开发,尤其是涉及到一些需要自定义绘制、动画或者复杂交互的页面时,canvas组件几乎是我们的不二之选。它功能强大,能画图表、做签名、实现游戏动画,甚至处理图片滤镜。但只要…

2026/8/3 4:43:12
学习日记 8.1

学习日记 8.1

前言前一篇文章讲了图片读取与显示,今天继续看图像运算、阈值处理和噪声去除。主要涉及:图像运算:图像的加法运算与加权融合阈值处理:二值化、截断等阈值操作,以及图像边框的填充噪声去除:椒盐噪声的生成与…

2026/8/3 4:38:12