并行与分布式系统中的并行K-中心点聚类:基于并行化CLARANS算法的改进与优化
算法背景
K-中心点聚类(K-medoids)是一种比K-means更鲁棒的聚类方法,因为它选择实际数据点(中心点)作为聚类中心,而非计算均值。CLARANS(Clustering Large Applications based on RANdomized Search)是一种用于大规模数据的K-中心点聚类算法,它通过随机搜索和局部优化来减少计算开销。然而,在超大规模数据集上,CLARANS的计算量依然巨大。为了加速,研究者提出了并行化的CLARANS算法,利用多机或多核并行处理,显著提升聚类效率。
算法输入与输出
- 输入:数据集 \(D = \{x_1, x_2, ..., x_n\}\)(n个点),聚类数 \(k\),最大邻居采样数 \(max\_neighbor\),局部最优阈值 \(num\_local\)。
- 输出:k个中心点集合 \(M = \{m_1, m_2, ..., m_k\}\),及每个点的聚类分配。
算法核心思想
CLARANS将聚类问题转化为图搜索问题:每个状态表示一组k个中心点,通过随机交换一个中心点与非中心点生成邻居状态,使用代价函数(如总距离和)评估状态质量。算法在局部搜索中随机探索邻居,避免陷入局部最优。并行化CLARANS的核心思想是将搜索空间分解,让多个工作节点并行执行独立的局部搜索,最后合并最佳结果。
详细步骤讲解
步骤1:问题建模与图表示
CLARANS将聚类问题映射到一个图 \(G = (V, E)\):
- 每个节点(状态)表示一组k个中心点。
- 边表示通过一次交换(swap)操作可达的邻居状态:随机将一个中心点替换为一个非中心点。
- 代价函数:对于状态 \(S\),定义总距离 \(TC(S) = \sum_{x \in D} \min_{m \in S} dist(x, m)\),其中 \(dist\) 是距离函数(如欧氏距离)。
- 目标:找到使 \(TC(S)\) 最小的状态。
步骤2:串行CLARANS流程回顾
串行CLARANS包含两层循环:
- 外层循环:重复 \(num\_local\) 次,每次从一个随机初始状态开始,进行局部搜索。
- 内层循环:在当前状态,随机采样最多 \(max\_neighbor\) 个邻居状态。若找到更优邻居,则移动到该邻居并重新开始采样;否则当前状态为局部最优,记录并跳出内层循环。
- 最终从 \(num\_local\) 个局部最优中选取最佳状态作为输出。
步骤3:并行化设计策略
并行CLARANS的关键是任务级并行。将外层循环的 \(num\_local\) 次独立局部搜索分配到多个处理器(或机器)上并行执行。每个处理器独立运行完整的局部搜索过程,无需通信。最后,通过一次归约操作收集所有处理器的局部最优结果,选择全局最佳。
步骤4:并行算法详细步骤
假设有 \(p\) 个处理器(编号 \(0\) 到 \(p-1\)),数据全集 \(D\) 预先划分到各处理器(例如通过随机采样或块划分)。每个处理器存储数据的本地副本或划分。
-
初始化:
- 每个处理器 \(i\) 生成 \(\lceil num\_local / p \rceil\) 个随机初始状态(即随机选择k个中心点),作为本地的搜索任务列表。
-
并行局部搜索(每个处理器独立执行):
- 对于每个初始状态 \(S_{init}\):
a. 设置当前状态 \(S_{curr} = S_{init}\),计算 \(TC(S_{curr})\)。
b. 重复以下步骤最多 \(max\_neighbor\) 次:- 随机选择一个中心点 \(m \in S_{curr}\) 和一个非中心点 \(x \in D \setminus S_{curr}\)。
- 生成邻居状态 \(S_{neighbor} = S_{curr} \setminus \{m\} \cup \{x\}\)。
- 计算 \(TC(S_{neighbor})\)。
- 如果 \(TC(S_{neighbor}) < TC(S_{curr})\):
- 更新 \(S_{curr} = S_{neighbor}\)。
- 重置采样计数,重新开始内层循环。
- 否则,继续采样下一个邻居。
c. 若在 \(max\_neighbor\) 次采样内未找到更优邻居,则 \(S_{curr}\) 为局部最优状态,保存 \((S_{curr}, TC(S_{curr}))\)。
- 每个处理器从其所有局部最优中选出代价最小的一个,记为本地最佳状态 \(S_{local\_best}^i\)。
- 对于每个初始状态 \(S_{init}\):
-
全局归约:
- 通过归约操作(如MPI_Allreduce)收集所有处理器的 \(S_{local\_best}^i\) 和对应的代价。
- 选择全局代价最小的状态 \(S_{global\_best}\) 作为最终中心点集合。
-
分配聚类标签(可选并行):
- 各处理器根据 \(S_{global\_best}\) 计算本地数据点的最近中心点,分配聚类标签。
步骤5:代价计算优化
计算 \(TC(S)\) 需要遍历所有数据点,是主要开销。优化方法:
- 增量计算:当状态从 \(S_{curr}\) 变为 \(S_{neighbor}\) 时,只重新计算受影响点的距离(即原先属于被替换中心点的点),避免全量计算。
- 距离矩阵预计算:若数据规模适中,可预计算所有点对距离矩阵,供快速查找。
步骤6:负载均衡与通信优化
- 若数据分布不均,可采用动态任务分配:设置全局任务池,处理器空闲时获取新任务,避免部分处理器早闲。
- 全局归约只传输k个中心点ID和代价值,通信量极小。
步骤7:算法复杂度分析
- 时间复杂度:串行CLARANS为 \(O(n^2 \cdot k \cdot max\_neighbor \cdot num\_local)\)。并行版本将 \(num\_local\) 分摊到p个处理器,理想加速比为 \(O(p)\)。
- 空间复杂度:主要存储数据和距离矩阵(若预计算),为 \(O(n^2)\) 或 \(O(n)\)(增量计算)。
总结
并行CLARANS通过将独立的多起点局部搜索分配到多个处理器,实现了高效的任务并行。其优点包括:易于实现、通信开销低、适用于大规模数据。但需要注意随机搜索可能陷入局部最优,可通过增加 \(num\_local\) 来提高全局最优概率。实际应用中,常结合采样技术(如对数据点采样以减少计算量)进一步加速,使算法更适用于分布式环境。