点云欧式聚类,条件欧式聚类算法原理及推导

点云欧式聚类算法数学推导

点云欧式聚类(Euclidean Clustering for Point Clouds)是点云处理中常用的一种无监督聚类方法。它基于欧式距离将点云中的点划分为多个簇,常用于分割、目标检测等任务。以下是算法的数学推导和实现原理。


问题定义

给定一个点云数据集 P = p 1 , p 2 , ... , p N P = {p_1, p_2, \dots, p_N} P=p1,p2,...,pN,每个点 p i p_i pi 是 3D 空间中的点,具有坐标 p i = ( x i , y i , z i ) p_i = (x_i, y_i, z_i) pi=(xi,yi,zi)。目标是将这些点划分为 K K K 个簇 C = C 1 , C 2 , ... , C K C = {C_1, C_2, \dots, C_K} C=C1,C2,...,CK,使得:

  1. 同一个簇中的点彼此之间的欧式距离较小;
  2. 不同簇之间的点距离较远。

核心算法

点云欧式聚类通常使用 邻域搜索区域生长 技术。其基本步骤如下:

1. 邻域搜索

点 p i p_i pi 的邻域定义为欧式距离小于某阈值 ϵ \epsilon ϵ 的点集:
N ( p i ) = { p j ∈ P ∣ ∥ p i − p j ∥ ≤ ϵ } , \mathcal{N}(p_i) = \{p_j \in P \mid \|p_i - p_j\| \leq \epsilon\}, N(pi)={pj∈P∣∥pi−pj∥≤ϵ},

其中 ∣ ⋅ ∣ |\cdot| ∣⋅∣ 表示欧式距离:
∥ p i − p j ∥ = ( x i − x j ) 2 + ( y i − y j ) 2 + ( z i − z j ) 2 . \|p_i - p_j\| = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2 + (z_i - z_j)^2}. ∥pi−pj∥=(xi−xj)2+(yi−yj)2+(zi−zj)2 .

2. 聚类过程
  • 使用区域生长法将点归为不同的簇:
    1. 从点云中随机选择一个未分配的点 p i p_i pi 作为种子点,初始化一个新簇 C k C_k Ck。
    2. 将种子点的邻域 N ( p i ) \mathcal{N}(p_i) N(pi) 中的所有点加入簇 C k C_k Ck。
    3. 对每个新加入簇的点,继续搜索其邻域,重复步骤 2,直到没有符合条件的点。
    4. 处理剩余未分配的点,直到所有点都被分配到某个簇或标记为噪声点。
3. 噪声点处理

如果某个点的邻域大小小于一个最小点数阈值 n m i n n_{min} nmin,则将其标记为噪声点,不归属于任何簇。


目标函数

点云欧式聚类隐含地最小化了簇内点与簇中心的平均距离,并满足约束条件 ∣ p i − p j ∣ ≤ ϵ |p_i - p_j| \leq \epsilon ∣pi−pj∣≤ϵ:
J = ∑ k = 1 K ∑ p i ∈ C k ∥ p i − μ k ∥ 2 , J = \sum_{k=1}^K \sum_{p_i \in C_k} \|p_i - \mu_k\|^2, J=k=1∑Kpi∈Ck∑∥pi−μk∥2,

其中 μ k \mu_k μk 是簇 C k C_k Ck 的几何中心:
μ k = 1 ∣ C k ∣ ∑ p i ∈ C k p i . \mu_k = \frac{1}{|C_k|} \sum_{p_i \in C_k} p_i. μk=∣Ck∣1pi∈Ck∑pi.

然而,点云欧式聚类的实现并不直接优化上述目标函数,而是基于邻域搜索和生长过程间接完成聚类。


算法伪代码

pseudo 复制代码
Input: 点云 P, 距离阈值 ε, 最小点数 n_min
Output: 聚类结果 C, 噪声点集合 N

1. 初始化:C = {}, N = {}, 未访问点集 V = P
2. while V 非空:
      2.1 随机选择一个种子点 p_i ∈ V
      2.2 如果邻域点数 |𝒩(p_i)| < n_min:
              标记为噪声点,N = N ∪ {p_i}
      2.3 否则:
              初始化新簇 C_k = {}
              使用区域生长法将 p_i 和其邻域点加入 C_k
              C = C ∪ {C_k}
      2.4 从 V 中移除已分配的点
3. 返回 C 和 N

复杂度分析

  1. 邻域搜索:
    • 基于 k k k-d 树或其他空间分割数据结构,搜索单点邻域的复杂度为 O ( log ⁡ N ) O(\log N) O(logN)。
  2. 聚类过程:
    • 对每个点访问一次,总复杂度为 O ( N ⋅ log ⁡ N ) O(N \cdot \log N) O(N⋅logN)。

优缺点

优点
  • 简单直观,直接基于几何距离。
  • 对无规则点云分布效果较好。
  • 可通过调整参数 ϵ \epsilon ϵ 和 n m i n n_{min} nmin 控制聚类结果。
缺点
  • 对参数敏感, ϵ \epsilon ϵ 和 n m i n n_{min} nmin 需要根据点云密度调整。
  • 对于稀疏或密度变化大的点云可能效果不佳。

实际应用

点云欧式聚类广泛应用于:

  • 3D 点云分割:如分离不同物体表面。
  • 目标检测与跟踪:在点云中检测独立目标。
  • 场景重建:划分不同的地形、建筑或物体。

在实践中,常用工具如 PCL(Point Cloud Library) 提供了高效的点云欧式聚类实现,函数为 pcl::EuclideanClusterExtraction




条件欧式聚类算法推导

条件欧式聚类(Conditioned Euclidean Clustering)在传统欧式距离聚类的基础上加入约束条件,解决了一些先验信息明确的问题。以下是算法的推导过程:


基础聚类模型

给定一个数据集 X = x 1 , x 2 , ... , x N X = {x_1, x_2, \dots, x_N} X=x1,x2,...,xN,希望将其划分为 K K K 个簇 C = C 1 , C 2 , ... , C K C = {C_1, C_2, \dots, C_K} C=C1,C2,...,CK,使得每个簇的紧密性(Intra-Cluster Compactness)最小化:
J = ∑ k = 1 K ∑ x i ∈ C k ∥ x i − μ k ∥ 2 , J = \sum_{k=1}^K \sum_{x_i \in C_k} \|x_i - \mu_k\|^2, J=k=1∑Kxi∈Ck∑∥xi−μk∥2,

其中:

  • μ k \mu_k μk 是簇 C k C_k Ck 的中心: μ k = 1 ∣ C k ∣ ∑ x i ∈ C k x i . \mu_k = \frac{1}{|C_k|} \sum_{x_i \in C_k} x_i. μk=∣Ck∣1∑xi∈Ckxi.

条件约束引入

引入两种常见约束条件:

  1. Must-Link Constraint :
    • 如果 x i x_i xi 和 x j x_j xj 有必须链接关系,则它们必须属于同一个簇: x i ∈ C k    ⟺    x j ∈ C k . x_i \in C_k \iff x_j \in C_k. xi∈Ck⟺xj∈Ck.
  2. Cannot-Link Constraint :
    • 如果 x i x_i xi 和 x j x_j xj 有不能链接关系,则它们必须属于不同的簇: x i ∈ C k    ⟹    x j ∉ C k . x_i \in C_k \implies x_j \notin C_k. xi∈Ck⟹xj∈/Ck.

为了考虑这些约束条件,可以引入一个惩罚项到目标函数中:
J ′ = ∑ k = 1 K ∑ x i ∈ C k ∥ x i − μ k ∥ 2 + λ ⋅ P ( C ) , J' = \sum_{k=1}^K \sum_{x_i \in C_k} \|x_i - \mu_k\|^2 + \lambda \cdot P(C), J′=k=1∑Kxi∈Ck∑∥xi−μk∥2+λ⋅P(C),

其中:

  • P ( C ) P(C) P(C) 是惩罚函数,定义为违反 Must-Link 和 Cannot-Link 条件的代价。
  • λ \lambda λ 是权重因子,控制约束的重要性。

惩罚函数 P ( C ) P(C) P(C) 定义
P ( C ) = ∑ Must-Link δ ( x i , x j ) + ∑ Cannot-Link ( 1 − δ ( x i , x j ) ) , P(C) = \sum_{\text{Must-Link}} \delta(x_i, x_j) + \sum_{\text{Cannot-Link}} (1 - \delta(x_i, x_j)), P(C)=Must-Link∑δ(xi,xj)+Cannot-Link∑(1−δ(xi,xj)),

其中 δ ( x i , x j ) = 1 \delta(x_i, x_j) = 1 δ(xi,xj)=1 表示 x i x_i xi 和 x j x_j xj 属于同一簇,否则 δ ( x i , x j ) = 0 \delta(x_i, x_j) = 0 δ(xi,xj)=0。


算法推导

1. 初始化
  • 随机初始化 K K K 个簇的中心点 μ k \mu_k μk。
  • 确定 Must-Link 和 Cannot-Link 的约束矩阵。
2. 分配数据点

对于每个数据点 x i x_i xi:

  1. 计算其到所有簇中心的距离:
    d k ( x i ) = ∥ x i − μ k ∥ 2 . d_k(x_i) = \|x_i - \mu_k\|^2. dk(xi)=∥xi−μk∥2.

  2. 考虑约束条件修正距离:

    • 如果 Must-Link 约束要求 x i x_i xi 和 x j x_j xj 必须在同一簇,则将 d k ( x i ) d_k(x_i) dk(xi) 加权调整,使 x i x_i xi 更倾向于聚类到包含 x j x_j xj 的簇。
    • 如果 Cannot-Link 约束要求 x i x_i xi 和 x j x_j xj 不在同一簇,则对 d k ( x i ) d_k(x_i) dk(xi) 增加惩罚,使其远离包含 x j x_j xj 的簇。

修正公式为:
d ~ k ( x i ) = d k ( x i ) + λ ⋅ Δ c o n s t r a i n t s , \tilde{d}k(x_i) = d_k(x_i) + \lambda \cdot \Delta{constraints}, d~k(xi)=dk(xi)+λ⋅Δconstraints,

其中 Δ c o n s t r a i n t s \Delta_{constraints} Δconstraints 表示违反 Must-Link 或 Cannot-Link 的代价。

3. 更新聚类中心

更新每个簇的中心:
μ k = 1 ∣ C k ∣ ∑ x i ∈ C k x i . \mu_k = \frac{1}{|C_k|} \sum_{x_i \in C_k} x_i. μk=∣Ck∣1xi∈Ck∑xi.

4. 迭代

重复步骤 2 和 3,直到满足以下条件之一:

  • 聚类结果不再变化;
  • 最大迭代次数达到。

实现注意事项

  1. 复杂度控制
    • 计算 Must-Link 和 Cannot-Link 的代价矩阵可能较耗时,需要优化数据结构或使用稀疏矩阵存储。
  2. 距离度量调整
    • 如果数据分布非球形,可以使用 Mahalanobis 距离或其他非欧式度量。
  3. 惩罚权重 λ \lambda λ 的调节
    • 根据问题的实际需求,调整 λ \lambda λ 的值以平衡距离优化与约束满足。

总结

条件欧式聚类通过引入先验约束条件,对传统的聚类方法进行改进,目标函数变为:
J ′ = ∑ k = 1 K ∑ x i ∈ C k ∥ x i − μ k ∥ 2 + λ ⋅ P ( C ) , J' = \sum_{k=1}^K \sum_{x_i \in C_k} \|x_i - \mu_k\|^2 + \lambda \cdot P(C), J′=k=1∑Kxi∈Ck∑∥xi−μk∥2+λ⋅P(C),

有效结合了数据点的几何分布和先验关系,适用于需要结合规则优化的聚类问题。


具体案例

在条件聚类中,如果一个数据点 x i x_i xi 与 x j x_j xj 和 x k x_k xk 存在 Must-Link 关系,但 x j x_j xj 和 x k x_k xk 与 x i x_i xi 被分配到不同的簇,那么在计算 x i x_i xi 的距离(如修正后的欧式距离 d ~ k ( x i ) \tilde{d}_k(x_i) d~k(xi))时,需要根据 Must-Link 约束的违反程度对标准的欧式距离进行修正。

计算修正后的距离

修正距离的公式为:
d ~ k ( x i ) = d k ( x i ) + λ ⋅ Δ c o n s t r a i n t s , \tilde{d}k(x_i) = d_k(x_i) + \lambda \cdot \Delta{constraints}, d~k(xi)=dk(xi)+λ⋅Δconstraints,

其中:

  • d k ( x i ) d_k(x_i) dk(xi): x i x_i xi 到簇 C k C_k Ck 的标准欧式距离;
  • Δ c o n s t r a i n t s \Delta_{constraints} Δconstraints:约束代价值(表示违反 Must-Link 和 Cannot-Link 的代价);
  • λ \lambda λ:权重因子,决定约束代价的影响程度。

对于 Must-Link 约束 ( x i , x j ) (x_i, x_j) (xi,xj) 和 ( x i , x k ) (x_i, x_k) (xi,xk),如果 x j x_j xj 和 x k x_k xk 被分配到不同的簇:

  1. 如果 x i x_i xi 不与 x j x_j xj 或 x k x_k xk 同簇,违反 Must-Link 的代价为:
    Δ M L ( x i , x j ) = 1 , Δ M L ( x i , x k ) = 1. \Delta_{ML}(x_i, x_j) = 1, \quad \Delta_{ML}(x_i, x_k) = 1. ΔML(xi,xj)=1,ΔML(xi,xk)=1.

    总代价为 Δ M L = Δ M L ( x i , x j ) + Δ M L ( x i , x k ) = 2 \Delta_{ML} = \Delta_{ML}(x_i, x_j) + \Delta_{ML}(x_i, x_k) = 2 ΔML=ΔML(xi,xj)+ΔML(xi,xk)=2。

  2. 代价 Δ c o n s t r a i n t s \Delta_{constraints} Δconstraints 仅累计与 x i x_i xi 有 Must-Link 的点中实际违反约束的点。例如:
    Δ c o n s t r a i n t s = ∑ ( x i , x j ) ∈ M L Δ M L ( x i , x j ) . \Delta_{constraints} = \sum_{(x_i, x_j) \in ML} \Delta_{ML}(x_i, x_j). Δconstraints=(xi,xj)∈ML∑ΔML(xi,xj).


修正距离的最终值

  • 假设 x i x_i xi 的标准欧式距离为 d k ( x i ) d_k(x_i) dk(xi),修正后的距离为: d ~ k ( x i ) = d k ( x i ) + λ ⋅ Δ c o n s t r a i n t s \tilde{d}k(x_i) = d_k(x_i) + \lambda \cdot \Delta{constraints} d~k(xi)=dk(xi)+λ⋅Δconstraints.
  • 如果 Must-Link 约束全部被违反, Δ c o n s t r a i n t s \Delta_{constraints} Δconstraints 将显著增大,使得 x i x_i xi 不倾向于分配到当前的簇 C k C_k Ck。

具体情况的示例

假设 x i x_i xi 在一个二维空间内,标准欧式距离为:
d k ( x i ) = ( x i ( 1 ) − μ k ( 1 ) ) 2 + ( x i ( 2 ) − μ k ( 2 ) ) 2 , d_k(x_i) = \sqrt{(x_i^{(1)} - \mu_k^{(1)})^2 + (x_i^{(2)} - \mu_k^{(2)})^2}, dk(xi)=(xi(1)−μk(1))2+(xi(2)−μk(2))2 ,

其中 μ k \mu_k μk 是簇 C k C_k Ck 的质心。

如果 x j x_j xj 和 x k x_k xk 必须与 x i x_i xi 同簇,但 x j x_j xj 和 x k x_k xk 不在 C k C_k Ck 中,那么修正项为:
d ~ k ( x i ) = d k ( x i ) + λ ⋅ 2 , \tilde{d}_k(x_i) = d_k(x_i) + \lambda \cdot 2, d~k(xi)=dk(xi)+λ⋅2,

表示每违反一个 Must-Link 约束,距离增加一个固定量。


总结

在条件聚类中, x i x_i xi 的修正距离结合了标准的欧式距离和约束代价。如果 Must-Link 约束被严重违反(如多个相关点被分配到不同簇),那么修正后的距离会显著增大,从而降低 x i x_i xi 分配到当前簇的概率。这种方法有效地将约束融入聚类过程。

相关推荐
糕冷小美n2 小时前
jeecgbootvue2重新整理数组数据或者添加合并数组并遍历背景图片或者背景颜色
数据结构·算法
ZZZ_O^O3 小时前
【贪心算法-第三弹——Leetcode-179.最大数】
c++·学习·算法·leetcode·贪心算法
Matlab程序猿小助手3 小时前
【MATLAB源码-第228期】基于matlab的鼠群优化算法(RSO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab·机器人·无人机
z千鑫4 小时前
【C/C++】深入解析 Stack 与 Queue 数据结构(详解):实现原理、应用场景与性能优化
c语言·开发语言·数据结构·c++·深度学习·算法·排序算法
Y编程小白4 小时前
Leecode经典题2--移除元素
数据结构·算法·leetcode
Wils0nEdwards4 小时前
Leetcode 颠倒二进制位
算法·leetcode·职场和发展
醇醛酸醚酮酯4 小时前
两数之和--leetcode100题
数据结构·算法·leetcode
xiaoshiguang34 小时前
LeetCode:19.删除链表倒数第N个节点
算法·leetcode·链表
m0_675988234 小时前
Leetcode3208:交替组 II
c语言·数据结构·算法·leetcode