【机器学习】DBSCAN聚类算法——原理、参数调优与实战

📅 2026/8/3 2:47:58
【机器学习】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 倍或更大数据量较大时可适当增加