并行与分布式系统中的并行化K-Medoids聚类:CLARA算法的并行化(Parallelized CLARA for K-Medoids Clustering)
问题描述
K-Medoids(也称为PAM,Partitioning Around Medoids)是一种经典的聚类算法,类似于K-Means,但使用数据集中的一个实际数据点(medoid)作为聚类中心,而不是计算均值点。这使得它对噪声和离群点更鲁棒。然而,标准PAM算法的时间复杂度较高(约为 \(O(k \cdot n^2)\),其中 \(k\) 为聚类数,\(n\) 为数据点数),在大规模数据集上计算代价昂贵。
CLARA(Clustering LARge Applications)是一种基于采样的近似算法,用于加速K-Medoids。它通过多次从原始数据集中抽取样本,在每个样本上运行PAM算法得到局部最优的medoids,然后在整个数据集上评估这些medoids的质量,选择最佳的一组作为最终结果。
并行化CLARA的目标是利用并行计算资源,同时对多个样本进行PAM计算,并并行评估medoids质量,从而显著缩短整体运行时间,同时保持聚类的质量。
解题过程循序渐进讲解
步骤1:理解串行CLARA算法的核心流程
在并行化之前,我们必须清楚串行CLARA的步骤:
- 参数设定:设定聚类数 \(k\),采样次数 \(m\),每个样本的大小 \(s\)(通常 \(s \ll n\),例如 \(s = 40 + 2k\))。
- 重复采样与局部PAM:进行 \(m\) 次循环(例如 \(m = 5\))。
- 每次从原始数据集 \(D\)(大小为 \(n\))中随机抽取一个样本 \(S_i\)(大小为 \(s\))。
- 在样本 \(S_i\) 上运行 PAM算法,找到 \(k\) 个medoids \(M_i = \{m_{i1}, ..., m_{ik}\}\)。
PAM算法本身分为两个阶段:- BUILD阶段:贪心选择初始medoids(例如通过选择使总相异度下降最快的点)。
- SWAP阶段:迭代尝试用非medoid点替换当前medoid,如果能够降低总相异度(即目标函数,通常是所有点到其最近medoid的距离之和),则接受替换,直到无法改进。
- 评估与选择:对于每一组得到的medoids \(M_i\),在整个数据集 \(D\) 上计算聚类质量(即总相异度)。选择总相异度最小的那组medoids作为最终聚类中心。
- 分配数据点:根据最终medoids,将 \(D\) 中所有点分配到最近的medoid,形成最终聚类。
CLARA的加速源于:在较小的样本上运行昂贵的PAM,而评估(步骤3)虽然涉及整个数据集,但计算相对廉价(只需计算每个点到 \(k\) 个medoids的距离并求和)。
步骤2:识别并行化机会
CLARA算法存在天然的并行性:
- 样本并行:\(m\) 个采样-PAM过程相互独立,可以并行执行。
- PAM内部的并行:PAM算法的SWAP阶段中,尝试替换不同medoid的候选点可以并行评估;距离计算也可以并行化。
- 评估并行:在整个数据集上评估多组medoids的质量时,不同数据点的距离计算可以并行,不同medoid组之间也可以并行评估。
最直接且高效的并行化策略是 样本级并行:并行处理多个样本的PAM计算。同时,在评估阶段也可以并行化距离计算。
步骤3:设计并行化CLARA算法框架
我们采用 主从(Master-Worker)模型 或 任务并行 框架:
-
主进程/线程(Master):
- 读取整个数据集 \(D\)(大小为 \(n\))。
- 设定参数 \(k, m, s\)。
- 生成 \(m\) 个采样任务:每个任务指定一个随机种子,用于生成样本 \(S_i\)(注意:可以通过索引采样或生成随机数列表来定义样本,避免传输整个数据集)。
- 将任务分配给工作进程/线程(Worker)。
- 收集所有Worker返回的medoid组 \(M_i\) 及其在样本上的局部目标函数值(可选,用于初步筛选)。
- 启动评估阶段:将每个medoid组 \(M_i\) 和整个数据集 \(D\) 分配给Worker,并行计算总相异度。
- 选择总相异度最小的medoid组作为最终结果。
- 执行最终分配(也可并行)。
-
工作进程/线程(Worker):
- 接收任务(例如,采样种子或样本索引列表)。
- 根据种子生成样本 \(S_i\)(或从主节点接收样本点)。
- 在样本 \(S_i\) 上运行 并行化的PAM算法,得到 \(M_i\)。
- 将 \(M_i\) 返回给Master。
- 在评估阶段,接收一组medoids \(M_i\),计算整个数据集 \(D\) 中所有点到这组medoids的总距离(并行计算点之间的距离)。
步骤4:并行化PAM算法(在每个样本上)
在每个Worker上,我们需要高效地在样本 \(S_i\) 上运行PAM。PAM的SWAP阶段是主要开销,我们可以并行化候选交换的评估:
- 距离矩阵预计算:对于样本 \(S_i\)(大小 \(s\)),预计算一个 \(s \times s\) 的距离矩阵 \(dist\)。由于 \(s\) 较小,这个矩阵可以存储在共享内存中供所有线程访问。
- 并行SWAP评估:在每次迭代中,尝试用每个非medoid点 \(h\) 替换每个medoid点 \(m_j\)(共约 \(k \cdot (s - k)\) 种候选交换)。对于每一种候选交换 \((h, m_j)\),我们需要计算如果进行此交换,目标函数的变化量 \(\Delta\)。
- 我们可以将候选交换分配给多个线程并行计算。
- 每个线程计算 \(\Delta\) 的方法:
- 对于样本中的每个点 \(p\),计算其到当前medoids集合(临时替换后)的最小距离。由于样本小,可以直接扫描计算。
- 或者,利用预计算的距离矩阵,\(\Delta\) 可以通过分析计算(例如,对于每个点,比较替换前后最近medoid的变化)而不必重新全扫描,但实现稍复杂。
- 同步与选择:所有线程计算完候选交换的 \(\Delta\) 后,选择一个使 \(\Delta\) 最小(且为负)的交换执行。然后更新medoids集合,进入下一轮迭代,直到没有改进(\(\Delta \ge 0\))。
这种并行化显著加速了SWAP阶段,因为评估候选交换是内层循环的瓶颈。
步骤5:并行评估medoids组(在整个数据集上)
评估阶段需要对每组medoids \(M_i\) 计算整个数据集 \(D\) 的总相异度。这里可以两层并行:
- 组间并行:不同medoid组 \(M_i\) 的评估完全独立,可以分配给不同Worker并行计算。
- 数据并行:对于单个medoid组的评估,可以将数据集 \(D\) 划分为块,分给多个线程计算每个数据块的点到medoids的距离和,然后求和。
具体操作:
- Master将数据集 \(D\) 划分为 \(t\) 个块(\(t\) 为线程数),每个块包含大约 \(n/t\) 个点。
- 对于每个medoid组 \(M_i\),每个线程计算自己数据块中所有点到 \(M_i\) 中每个medoid的距离,找到最近medoid的距离,并累加得到局部和。
- 然后通过归约(reduce)操作(例如,并行求和)得到总相异度。
由于评估阶段需要计算 \(m \times n \times k\) 次距离(但实际上每个点只需要计算到 \(k\) 个medoids的距离并取最小),并行化效果明显。
步骤6:通信与负载均衡考虑
- 数据分布:在整个数据集 \(D\) 较大的情况下,可以让每个Worker存储一份完整的 \(D\)(如果内存允许),或者Master将数据块分发给Worker。对于评估阶段,每个Worker需要访问整个 \(D\),因此数据复制或划分传输是必要的。
- 任务分配:Master将 \(m\) 个采样任务动态分配给Worker(例如,使用任务池),以实现负载均衡,因为不同样本上PAM的收敛速度可能不同。
- 结果收集:Worker将medoid组 \(M_i\)(仅 \(k\) 个点索引)和评估值返回给Master,通信量很小。
步骤7:算法复杂度分析(并行版本)
- 时间:
- 串行CLARA:\(O(m \cdot (s^2 \cdot k \cdot I_{PAM} + n \cdot k))\),其中 \(I_{PAM}\) 是PAM的SWAP迭代次数。
- 并行CLARA(假设 \(p\) 个处理器):
- 样本PAM并行:理想情况下,\(m\) 个样本分配给 \(p\) 个Worker,时间降为 \(O(\lceil m/p \rceil \cdot (s^2 \cdot k \cdot I_{PAM} / t_{in}))\),其中 \(t_{in}\) 是PAM内部并行带来的加速(例如,使用多线程并行SWAP评估)。
- 评估并行:评估 \(m\) 组medoids,可以并行评估不同组,同时每组评估内部数据并行,时间降为 \(O(\lceil m/p \rceil \cdot (n \cdot k / t_{data}))\),其中 \(t_{data}\) 是数据划分的线程数。
- 空间:每个Worker需要存储整个数据集 \(D\)(或部分块)以及样本的距离矩阵(\(O(s^2)\))。
步骤8:实际实现提示
- 使用并行编程框架如MPI(进程间)或OpenMP(线程级)实现。
- 随机采样时,每个Worker使用独立随机数生成器,通过不同种子保证样本不重叠。
- 在评估阶段,可以将medoid组分批评估,以平衡通信和计算。
- 可以进一步优化:在PAM的BUILD阶段也可以并行化(例如,并行计算每个候选点作为初始medoid的目标函数值)。
总结
通过将CLARA算法的多个采样-PAM过程并行执行,并在每个PAM内部以及全局评估阶段引入数据并行,我们可以显著加速K-Medoids聚类在大规模数据集上的计算。这种方法在保持算法近似质量的同时,充分利用了并行计算资源,适用于分布式内存集群或多核共享内存系统。