通俗易懂讲透 DBSCAN 聚类算法
通俗易懂讲透 DBSCAN 聚类算法本科生/研究生都能看懂本文用大白话生活比喻公式拆解完整代码可视化把 DBSCAN 从原理、流程、参数、优缺点到实战讲得明明白白适合机器学习入门、面试复习、课程笔记。一、先搞懂DBSCAN 到底是什么一句话定义DBSCAN 基于密度的聚类算法自动找密集团、自动识别噪声不用提前设聚类数量。和 K-Means 最大区别K-Means只能分球形簇必须先告诉 K 是几DBSCAN任意形状都能分自动找簇、自动剔异常点二、最形象比喻人群扎堆把数据点看作一群人核心点周围人很多是人群中心边界点在人群边上不算中心但属于这一堆噪声点孤零零一个人不属于任何群体DBSCAN 就是找到所有密集人群 → 连成一簇 → 把落单的标为噪声。三、两个必须懂的超参数DBSCAN 只需要设两个参数非常简单1. εeps半径以一个点为中心画圆的半径含义多大范围内的点才算“邻居”2. MinPtsmin_samples半径内至少要有多少个点才算“密集”包括自己四、3 种点的定义面试必考核心点 Core半径 ε 内点数量 ≥ MinPts边界点 Border不是核心点但落在某个核心点的 ε 范围内噪声点 Noise既不是核心也不在任何核心点范围内标为 -1五、DBSCAN 算法流程4 步背会随便选一个没访问过的点看它是不是核心点如果是把它密度可达的所有点连成一个簇继续遍历直到所有点处理完剩下的就是噪声六、代码实战月牙形数据聚类最强演示直接复制可运行包含月牙数据生成标准化DBSCAN 聚类K 距离图选 ε聚类结果可视化轮廓系数评估网格搜索调参importnumpyasnpimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.datasetsimportmake_moonsfromsklearn.preprocessingimportStandardScalerfromsklearn.clusterimportDBSCANfromsklearn.metricsimportsilhouette_scorefromsklearn.neighborsimportNearestNeighborsfromsklearn.model_selectionimportParameterGrid# 1. 生成月牙数据 X,_make_moons(n_samples3000,noise0.1,random_state42)# 标准化非常重要scalerStandardScaler()X_scaledscaler.fit_transform(X)# 2. K-距离图选择最优 eps min_samples5neighborsNearestNeighbors(n_neighborsmin_samples)neighbors_fitneighbors.fit(X_scaled)distances,_neighbors_fit.kneighbors(X_scaled)distancesnp.sort(distances[:,-1])plt.figure(figsize(10,4))plt.plot(distances)plt.title(K-distance Graph拐点即为最佳eps)plt.xlabel(点排序)plt.ylabel(第k个近邻距离)plt.grid()plt.show()# 3. DBSCAN 聚类 eps0.3dbDBSCAN(epseps,min_samplesmin_samples)labelsdb.fit_predict(X_scaled)n_clusterslen(set(labels))-(1if-1inlabelselse0)n_noiselist(labels).count(-1)print(f聚类数量{n_clusters})print(f噪声点数{n_noise})# 4. 可视化结果 plt.figure(figsize(10,6))sns.scatterplot(xX_scaled[:,0],yX_scaled[:,1],huelabels,paletteviridis,s30)plt.title(fDBSCAN 聚类结果 | eps{eps}, min_samples{min_samples})plt.show()# 5. 轮廓系数评估 iflen(set(labels))1:scoresilhouette_score(X_scaled,labels)print(f轮廓系数{score:.3f})# 6. 网格搜索自动调参 param_grid{eps:[0.2,0.25,0.3,0.35,0.4],min_samples:[3,5,7,10]}best_score-1best_paramNoneforparamsinParameterGrid(param_grid):labelsDBSCAN(**params).fit_predict(X_scaled)iflen(set(labels))1:scoresilhouette_score(X_scaled,labels)ifscorebest_score:best_scorescore best_paramparamsprint(最优参数,best_param)print(最优轮廓系数,best_score)七、DBSCAN 优点面试必背不用指定聚类数量能识别噪声点对异常值鲁棒能聚类任意形状月牙、螺旋、环形都行对初始值不敏感簇的大小形状不限八、DBSCAN 缺点必须知道对 eps 和 min_samples 非常敏感高维数据距离失效效果变差密度不均匀的数据很难调好参数大数据集速度较慢九、DBSCAN vs K-Means速记表特点K-MeansDBSCAN聚类形状球形任意形状是否指定簇数必须不用噪声处理差强离群点敏感敏感不敏感速度快较慢高维一般差十、什么时候用 DBSCAN✅适合数据簇形状不规则有噪声、异常点不知道聚几类数据分布复杂月牙、环形、螺旋❌不适合高维数据密度差异很大超大规模数据十一、一句话总结DBSCAN 是基于密度的聚类神器自动找簇、自动剔噪专治各种不规则形状数据是机器学习必须掌握的聚类算法。