并行与分布式系统中的并行化K-Medoids聚类:CLARA算法的并行化(Parallelized CLARA for K-Medoids Clustering)
字数 4259 2025-12-23 03:05:46

并行与分布式系统中的并行化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的步骤:

  1. 参数设定:设定聚类数 \(k\),采样次数 \(m\),每个样本的大小 \(s\)(通常 \(s \ll n\),例如 \(s = 40 + 2k\))。
  2. 重复采样与局部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的距离之和),则接受替换,直到无法改进。
  3. 评估与选择:对于每一组得到的medoids \(M_i\),在整个数据集 \(D\) 上计算聚类质量(即总相异度)。选择总相异度最小的那组medoids作为最终聚类中心。
  4. 分配数据点:根据最终medoids,将 \(D\) 中所有点分配到最近的medoid,形成最终聚类。

CLARA的加速源于:在较小的样本上运行昂贵的PAM,而评估(步骤3)虽然涉及整个数据集,但计算相对廉价(只需计算每个点到 \(k\) 个medoids的距离并求和)。


步骤2:识别并行化机会

CLARA算法存在天然的并行性:

  • 样本并行\(m\) 个采样-PAM过程相互独立,可以并行执行。
  • PAM内部的并行:PAM算法的SWAP阶段中,尝试替换不同medoid的候选点可以并行评估;距离计算也可以并行化。
  • 评估并行:在整个数据集上评估多组medoids的质量时,不同数据点的距离计算可以并行,不同medoid组之间也可以并行评估。

最直接且高效的并行化策略是 样本级并行:并行处理多个样本的PAM计算。同时,在评估阶段也可以并行化距离计算。


步骤3:设计并行化CLARA算法框架

我们采用 主从(Master-Worker)模型任务并行 框架:

  1. 主进程/线程(Master)

    • 读取整个数据集 \(D\)(大小为 \(n\))。
    • 设定参数 \(k, m, s\)
    • 生成 \(m\) 个采样任务:每个任务指定一个随机种子,用于生成样本 \(S_i\)(注意:可以通过索引采样或生成随机数列表来定义样本,避免传输整个数据集)。
    • 将任务分配给工作进程/线程(Worker)。
    • 收集所有Worker返回的medoid组 \(M_i\) 及其在样本上的局部目标函数值(可选,用于初步筛选)。
    • 启动评估阶段:将每个medoid组 \(M_i\) 和整个数据集 \(D\) 分配给Worker,并行计算总相异度。
    • 选择总相异度最小的medoid组作为最终结果。
    • 执行最终分配(也可并行)。
  2. 工作进程/线程(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\) 的总相异度。这里可以两层并行:

  1. 组间并行:不同medoid组 \(M_i\) 的评估完全独立,可以分配给不同Worker并行计算。
  2. 数据并行:对于单个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聚类在大规模数据集上的计算。这种方法在保持算法近似质量的同时,充分利用了并行计算资源,适用于分布式内存集群或多核共享内存系统。

并行与分布式系统中的并行化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聚类在大规模数据集上的计算。这种方法在保持算法近似质量的同时,充分利用了并行计算资源,适用于分布式内存集群或多核共享内存系统。