密度峰值快速搜索聚类算法(Clustering by Fast Search and Find of Density Peaks, DP)的原理与实现过程
一、 题目描述
密度峰值快速搜索聚类算法(以下简称DP算法或CFSFDP)是一种基于密度和相对距离的聚类算法,于2014年在《Science》上提出。与DBSCAN等传统密度算法不同,DP算法无需预先指定邻域半径,其核心思想是:类簇的中心点同时具有两个特征:局部密度高、且与密度更高的点之间的距离较大。算法通过计算每个数据点的局部密度和与更高密度点之间的距离,构造决策图,手动或自动选择聚类中心,然后将剩余的非中心点分配给离其最近且密度更高的点所在的类簇。该算法能发现非球形的类簇,对噪声点有一定的鲁棒性,并且聚类中心的选择直观。
二、 解题过程详解
我们将DP算法的实现分解为五个循序渐进的步骤。
步骤1:问题定义与核心假设
假设我们有一个包含 N 个数据点的数据集 \(X = \{x_1, x_2, ..., x_N\}\),每个数据点 \(x_i\) 是 D 维特征向量。我们的目标是将这些点划分为 K 个类簇。DP算法基于以下两个核心定义:
- 局部密度:衡量一个点周围邻居的密集程度。
- 相对距离:衡量一个点与比它密度更高的点之间的距离。
核心假设:聚类中心是那些局部密度高,同时与任何比其密度更高的点都“远离”的点。而噪声点则是那些局部密度低,但相对距离可能也较大的点。
步骤2:计算局部密度
对于一个数据点 \(x_i\),其局部密度 \(\rho_i\) 有两种主要计算方法:
- 截断核(Cut-off kernel):统计在点 \(x_i\) 的 截断距离 \(d_c\) 范围内的点的数量。
\[ \rho_i = \sum_{j \neq i} \chi(d_{ij} - d_c), \quad \chi(x) = \begin{cases} 1, & \text{if } x < 0 \\ 0, & \text{otherwise} \end{cases} \]
其中,\(d_{ij}\) 是点 \(x_i\) 和 \(x_j\) 之间的距离(通常用欧氏距离)。\(d_c\) 是一个需要预设的超参数,通常的选择是使得所有点的平均邻居数约为数据点总数的1%到2%。这种方法计算简单,得到的密度是离散的整数。
- 高斯核(Gaussian kernel):使用高斯函数平滑地计算密度,密度值是连续的。
\[ \rho_i = \sum_{j \neq i} \exp\left(-\left(\frac{d_{ij}}{d_c}\right)^2\right) \]
这种方法对 \(d_c\) 的敏感度较低,但计算量稍大。
距离矩阵:通常先预先计算所有点对之间的距离 \(d_{ij}\),形成一个 \(N \times N\) 的对称距离矩阵,以加速后续密度和距离的计算。
步骤3:计算相对距离
相对距离 \(\delta_i\) 定义为:对于点 \(x_i\),找到所有 密度比它高 的点,然后计算 \(x_i\) 到这些点中的 最小距离。
\[\delta_i = \min_{j: \rho_j > \rho_i}(d_{ij}) \]
对于整个数据集中密度最高的那个点,不存在密度比它更高的点。在这种情况下,定义其相对距离为它到所有其他点的最大距离。
\[\delta_{\text{max-density point}} = \max_j (d_{ij}) \]
这个定义的直观解释是:\(\delta_i\) 衡量了点 \(x_i\) 与“潜在”的更高密度中心之间的分离程度。
步骤4:识别聚类中心与噪声点
这是DP算法的关键步骤,通常有两种方式:
-
基于决策图的手动选择:
- 以 \(\rho\) (局部密度)为横轴,\(\delta\) (相对距离)为纵轴,为每个点绘制一个散点图,称为决策图。
- 在决策图中,聚类中心会出现在右上角区域,因为它们同时具有 较高的 \(\rho\) 和 较高的 \(\delta\) 。这些点会明显与其他点分离。
- 用户通过观察决策图,手动圈选出这些点作为聚类中心。类簇的数量 \(K\) 等于选出的中心点数量。
- 识别噪声点:通常,具有非常低的 \(\rho\) 但 \(\delta\) 值可能不低的点被视为噪声(或边界点)。可以设定一个密度阈值 \(\rho_{\text{thres}}\) 来剔除噪声。
-
自动选择策略:
- 计算一个指标 \(\gamma_i = \rho_i \times \delta_i\) 或 \(\gamma_i = \rho_i \times \delta_i^2\)。
- 对所有的 \(\gamma_i\) 进行降序排序,通常会观察到在排序列表中 \(\gamma\) 值有一个明显的“拐点”或“间隙”。
- 选择 \(\gamma\) 值最大的前 \(K\) 个点作为聚类中心,其中 \(K\) 可以通过寻找 \(\gamma\) 排序值的最大落差(如通过寻找Knee Point)来自动确定。
步骤5:分配非中心点到类簇
一旦确定了 \(K\) 个聚类中心,剩下的每个非中心点 \(x_i\) 的分配遵循一个简单的规则:
- 对于点 \(x_i\),找到离它最近的,且密度比它高的点 \(x_j\)。
- 将点 \(x_i\) 分配给点 \(x_j\) 所属的类簇。
- 这个过程可以被看作是从每个点出发,沿着“最近且更高密度”的路径,最终到达一个聚类中心的单向传播过程。
算法总结流程:
- 计算数据集中所有点对之间的距离。
- 选择合适的截断距离 \(d_c\)。
- 计算每个点的局部密度 \(\rho_i\)。
- 计算每个点的相对距离 \(\delta_i\)。
- 绘制决策图,并(手动或自动)选择聚类中心。
- (可选)根据密度阈值剔除噪声点。
- 将剩余的非中心点分配给相应的类簇。
三、 算法特点与应用注意事项
- 优点:
- 概念清晰,聚类中心在决策图上易于识别。
- 能识别非球形、密度不均匀的类簇。
- 无需迭代优化,分配过程高效。
- 缺点与注意事项:
- 对距离度量敏感,高维数据需谨慎。
- 截断距离 \(d_c\) 的选择会影响密度计算结果。高斯核方法对此的鲁棒性更好。
- 在数据规模很大时,计算所有点对距离 \(O(N^2)\) 会成为瓶颈。可以通过KD-Tree、Ball-Tree或近似最近邻方法进行优化。
- 决策图手动选择中心存在主观性,自动选择策略的稳定性需要考量。
- 对于存在密度渐变、没有明显密度峰值的流形结构,算法效果可能不佳。
该算法因其简洁优美的思想而在诸多领域得到应用,尤其适合于物理、生物信息学等领域中具有明显“中心”结构的数据集。