SNN-DPC 聚类算法

1,126 阅读4分钟

DPC聚类算法

2014年,Rodriguez等人在Science杂志发表了基于快速搜索和发现密度峰值的聚类算法(clustering by fast search and find of density peaks, DPC)。该算法可以自动地发现簇中心,然后将数据点分配到不同的簇中。

该算法基于两个基本假设:1)簇中心(密度峰值点)的局部密度大于围绕它的邻居的局部密度;2)不同簇中心之间的距离相对较远。为了找到同时满足这两个条件的簇中心,该算法引入了局部密度的定义。

1. 局部密度

数据集dataset中的数据点 ii 具有局部密度性质ρi\rho_{i}

基于截断距离的局部密度定义:ρi=ijχ(dijdc),χ(x)={1,x<00,x0\rho_{i}=\sum_{i \neq j} \chi\left(d_{i j}-d_{c}\right), \chi(x)=\left\{\begin{array}{ll}1, & x<0 \\ 0, & x \geq 0\end{array}\right.

基于核距离的局部密度定义:ρi=ijexp[(dijdc)2]\rho_{i}=\sum_{i \neq j} \exp \left[-\left(\frac{d_{i j}}{d_{c}}\right)^{2}\right] 其中:dijd_{i j}是数据点 i 和 j 的欧几里得距离; dc>0d_{c}>0,是自定义的截断距离。即局部区域的定义是以点 i 为圆心,dcd_{c}为半径的圆形区域。

这两种局部密度定义的主要区别是,二者分别是离散的和连续的。

2. 到更高密度点的最近距离

δi=minj:ρj>ρi(dij)\delta_{i}=\min _{j: \rho_{j}>\rho_{i}}\left(d_{i j}\right)

特殊地,对于局部密度峰值点ii,定义δi=maxij(δj)\delta_{i}=\max _{i \neq j}\left(\delta_{j}\right)

3. 决策值

为了方便地选择簇中心,取ρ\rhoδ\delta的乘积作为决策值加以衡量。 γi=ρi×δi\gamma_{i}=\rho_{i} \times \delta_{i}

取决策值γ\gamma最大的点作为簇中心。

DPC步骤

  1. 计算任意两个数据点之间的距离Dn×n={dij}n×nD^{n \times n}=\left\{d_{i j}\right\}^{n \times n}
  2. 根据截断距离算出任意数据点 xix_{i} 的局部密度 ρi\rho_{i}
  3. 对于任意数据点 xi,x_{i}, 计算出 δi\delta_{i}
  4. ρi\rho_{i} 为橫轴,以 δi\delta_{i} 为纵轴,画出决策图
  5. 利用决策图,将 ρi\rho_{i}δi\delta_{i} 都相对较高的点标记为簇中心; 将 ρi\rho_{i} 相对较低但是 δi\delta_{i} 相对较高的点标记为噪声点
  6. 将剩余点进行分配。分配时,将每个剩余点分配到它的最近邻且密度比其大的数据点所在的簇。

SNN-DPC算法

Rui.Liu等人发现,当两个簇的密度差异较大时(如经典的聚类数据集Jain),DPC算法选择的两个簇中心往往只位于密度较大簇上。通过改变局部密度的定义(基于共享k近邻点SNN(Shared Nearest Neighbors)的个数计算),来改进效果。

定义Shared Nearest Neighbors

对于数据集中的任意点 i 和 j ,Γ(i)\Gamma(i)是点 i 的 K个近邻点集合,Γ(j)\Gamma(j)是点 j 的 K个近邻点集合。

点 i 和点 j 的共享近邻点:SNN(i,j)=Γ(i)Γ(j)SNN(i, j)=\Gamma(i) \cap \Gamma(j)

定义SNN Similarity

sim(i,j)={SNN(i,j)2pSNN(i,j)(dip+djp), if i,jSNN(i,j)0, otherwise \operatorname{sim}(i, j)=\left\{\begin{array}{cl}\frac{|S N N(i, j)|^{2}}{\sum_{p \in SNN(i, j)}\left(d_{ip}+d_{jp}\right)} , & \text { if } i, j \in SNN(i, j) \\ 0, & \text { otherwise }\end{array}\right.

原式可化为SNN(i,j)×11SNN(i,j)pSNN(i,j)(dip+djp)|SNN(i, j)| \times \frac{1}{\frac{1}{|S N N(i, j)|} \sum_{p \in S N N(i, j)}\left(d_{i p}+d_{j p}\right)}, 其中:

  • SNN(i,j)|\operatorname{SNN}(i, j)|的物理含义是点 i 和点 j 共享近邻点的个数

  • 1SNN(i,j)pSNN(i,j)(dip+djp)\frac{1}{|S N N(i, j)|} \sum_{p \in S N N(i, j)}\left(d_{i p}+d_{j p}\right)的物理含义是点 i 和点 j 到他们的所有共享近邻点的距离的平均值

定义SNN局部密度

定义点 i 为数据集中的任意一点,L(i)={x1,x2,,xk}L(i)=\left\{x_{1}, x_{2}, \ldots, x_{k}\right\}是与点 i 的SNN Similarity最高的 k 个点。

SNN局部定义为:ρi=jL(i)sim(i,j)\rho_{i}=\sum_{j \in L(i)} \operatorname{sim}(i, j)

在这种定义下,局部密度不仅包含了距离信息,而且还通过许多SNN,包含了集群结构的信息

定义到更高密度点的最近距离

δi=minj:ρj>ρi[dij(pΓ(i)dip+qΓ(j)djq)]\delta_{i}=\min _{j: \rho_{j}>\rho_{i}}\left[d_{i j}\left(\sum_{p \in \Gamma(i)} d_{i p}+\sum_{q \in \Gamma(j)} d_{j q}\right)\right],注意这里的dijd_{i j}(pΓ(i)dip+qΓ(j)djq)\left(\sum_{p \in \Gamma(i)} d_{i p}+\sum_{q \in \Gamma(j)} d_{j q}\right)是相乘的关系,因为我们定义局部密度时,使用的距离定义有所改变。

特别的,局部密度最大值点的δi=maxj(Xi)(δj)\delta_{i}=\max _{j \in(X-i)}\left(\delta_{j}\right)

定义决策值

类似的,决策值γi=ρi×δi\gamma_{i}=\rho_{i} \times \delta_{i}

定义剩余点分配步骤中的绝对下属点和可能下属点

假设点 A 已经被分配到某个簇 c 中,点 B 尚未被分配:

SNN(A,B)k/2|S N N(A, B)| \geq k / 2,则称点 B 是簇 c 的绝对下属点,也就是说点 B 也一定会被分配到簇 c 中。 若0<SNN(A,B)<k/20<|S N N(A, B)|<k / 2,则称点 B 是簇 c 的可能下属点,点 B 可以是其他簇的下属点。

在极端情况下,假设点 B 同时满足 SNN(A1,B)=k/2|S N N(A_1, B)| = k / 2 SNN(A2,B)=k/2|S N N(A_2, B)| = k / 2,可以暂时将 k 加一,使其成为奇数

SNN-DPC步骤

  1. 计算任意两个数据点之间的距离Dn×n={dij}n×nD^{n \times n}=\left\{d_{i j}\right\}^{n \times n}
  2. 根据定义计算任意数据点的 SNN Similarity
  3. 算出任意数据点 xix_{i} 的局部密度 ρi\rho_{i}
  4. 对于任意数据点 xi,x_{i}, 计算出 δi\delta_{i}
  5. ρi\rho_{i} 为橫轴,以 δi\delta_{i} 为纵轴,画出决策图。或者以 ii 为橫轴,以 γi\gamma_{i} 为纵轴画出决策图
  6. 利用决策图,将 ρi\rho_{i}δi\delta_{i} 都相对较高的点标记为簇中心; 或者将γi\gamma_{i}较大的点作为簇中心
  7. 将剩余点中的绝对下属点进行分配。
  8. 将剩余点中的可能下属点进行分配。