DBSCAN聚类实战:从二维到三维的Python实现与参数调优指南
在数据科学领域,聚类分析是探索性数据分析的重要工具。不同于K-means等基于距离的算法,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)以其独特的密度聚类能力,能够发现任意形状的簇并有效识别噪声点。本文将带您从零开始实现DBSCAN算法,并通过Python代码演示如何应用于二维和三维数据。
1. DBSCAN算法核心原理深度解析
DBSCAN算法的魅力在于它基于密度的聚类思想。想象一下在夜空中观察星群——星星并非均匀分布,而是某些区域密集(星团),其他区域稀疏。DBSCAN正是模拟这种自然观察方式。
核心概念精要:
- ε邻域(eps):以某点为中心,半径为ε的圆形区域(二维)或球形空间(三维)
- 核心点:当某点的ε邻域内至少包含minPts个点(包括自身)时
- 边界点:位于核心点ε邻域内,但自身不满足核心点条件的点
- 噪声点:既非核心点也非边界点的孤立点
算法工作流程可分为三个关键步骤:
- 随机选择一个未访问点,检查其ε邻域
- 如果满足核心点条件,则扩展聚类:
- 将该点所有密度可达的点加入当前簇
- 递归检查新加入的核心点
- 标记无法归入任何簇的点为噪声
提示:DBSCAN不需要预先指定簇数量,这对真实数据集特别有价值,因为我们往往不知道数据中隐藏多少个自然分组。
2. Python实现DBSCAN从零搭建
让我们用Python实现完整的DBSCAN算法。为清晰展示实现细节,我们将代码分解为几个关键函数:
import numpy as np
from collections import deque
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
class DBSCAN:
def __init__(self, eps=0.5, min_samples=5):
self.eps = eps
self.min_samples = min_samples
def fit(self, X):
# 初始化标签:-1表示未访问,0表示噪声
labels = np.full(X.shape[0], -1)
cluster_id = 0
for i in range(X.shape[0]):
if labels[i] != -1:
continue
# 获取邻域点索引
neighbors = self._region_query(X, i)
if len

&spm=1001.2101.3001.5002&articleId=154006803&d=1&t=3&u=495d6765e59947a8a64fa7f056fd81f1)
483

被折叠的 条评论
为什么被折叠?



