在使用 K 均值聚类算法时,赋值阶段通常需要计算每个点到每个簇质心的距离,以找到最接近的簇。然而,通过利用三角不等式,我们可以减少一些不必要的距离计算,从而加快聚类过程。以下是利用三角不等式减少计算的一般步骤:
三角不等式
三角不等式说明,对于任何三个点 \( A, B, C \):
\[ d(A, C) \le d(A, B) + d(B, C) \]
这个特性可以帮助确定某些点到簇质心的距离无需计算。
一般步骤
1. 初始化:
- 随机选择 \( K \) 个点作为初始簇质心。
- 用 \( \mathbf{C} = \{c_1, c_2, \ldots, c_K\} \) 表示簇质心的集合,其中 \( c_k \) 是第 \( k \) 个簇的质心。
- 假设点集为 \( \mathbf{X} = \{x_1, x_2, \ldots, x_n\} \)。
2. 计算质心间的距离:
- 计算并存储每对质心之间的距离 \( d(c_i, c_j) \)。
- 用矩阵 \( D \) 表示这些距离, \( D_{ij} = d(c_i, c_j) \)。
3. 初始分配:
- 计算每个点 \( x_i \) 到每个质心 \( c_k \) 的距离,并将点分配给最近的质心,形成初始簇。
4. 主要迭代过程:
1. 更新质心:
- 计算每个簇的新质心。
- 更新质心集合 \( \mathbf{C} \)。
2. 更新质心间的距离:
- 重新计算并存储更新后的质心之间的距离矩阵 \( D \)。
3. 重新分配点:
- 对于每个点 \( x_i \),假设它当前分配到簇 \( c_a \),即 \( x_i \in C_a \)。
- 对于每个另一个簇质心 \( c_b \),检查三角不等式是否可以用于避免计算 \( d(x_i, c_b) \):
- 计算 \( d(x_i, c_a) \) 并存储。
- 检查条件:
\[
d(x_i, c_a) \le \frac{d(c_a, c_b)}{2}
\]
- 如果满足,则 \( d(x_i, c_b) \) 必然大于 \( d(x_i, c_a) \),无需计算, \( x_i \) 仍归属于 \( c_a \)。
- 如果不满足,则计算 \( d(x_i, c_b) \),并检查是否要将 \( x_i \) 分配给新的质心 \( c_b \):
\[
d(x_i, c_b) < d(x_i, c_a)
\]
- 如满足,则更新 \( x_i \) 的分配,将 \( x_i \) 移动到新的簇 \( c_b \)。
5.重复上述过程,直到簇质心不再发生显著变化或达到最大迭代次数:
- 不需要每次计算所有点与所有质心的距离。
- 使用三角不等式显著减少不必要的距离计算以节省时间。