并行与分布式系统中的并行K-中心点聚类:基于随机采样和局部搜索的并行CLARANS算法
题目描述
在数据挖掘和聚类分析中,K-中心点(K-medoids)是一种常用的聚类方法,它从数据集中选择实际存在的数据点作为中心点(medoids),相比K-means使用虚拟的均值点,K-中心点对噪声和异常值更鲁棒。然而,寻找最优的K个中心点是一个NP-hard问题。CLARANS(Clustering Large Applications based on RANdomized Search)算法是一种基于随机采样和局部搜索的启发式方法,用于高效求解大规模数据集上的K-中心点问题。在并行与分布式环境中,我们希望将CLARANS算法并行化,以加速对海量数据的聚类过程。题目要求:设计一个并行化的CLARANS算法,能够充分利用多机或多核资源,在保持聚类质量的前提下显著降低计算时间。
解题过程
-
理解CLARANS算法的串行版本
CLARANS算法的核心思想是:将搜索空间视为一个图,图中每个节点表示一种中心点集合的选择(即一个候选解),边表示两个节点之间可以通过交换一个中心点与非中心点来转换。算法通过随机游走在这个图上进行局部搜索:- 随机选择一个当前节点(即随机选择K个初始中心点)。
- 在当前位置的邻居中随机采样一定数量(由参数
num_local控制)的邻居节点,如果找到代价(即所有点到其最近中心点的距离之和)更低的邻居,则移动到该邻居。 - 重复上述过程直到达到局部最优(即连续
max_neighbor次采样未找到更好解)。 - 重新开始多次(由参数
num_restart控制)以探索不同区域,最终返回最佳中心点集合。
-
并行化机会分析
- 多个独立重启:CLARANS的每次重启是独立的,可以并行执行。
- 邻居采样与评估:在单次重启中,对多个邻居的代价计算是独立的,可以并行化。
- 数据分区:在计算代价(距离和)时,可以将数据点分区,在不同处理器上并行计算局部距离和,再汇总全局和。
-
并行CLARANS算法设计
这里我们采用基于任务并行的主从模型,结合数据并行进行代价计算:- 主进程:管理重启任务。创建
num_restart个重启任务,放入任务池。每个重启任务对应一次完整的CLARANS局部搜索。 - 从进程/工作线程:每个工作线程从任务池获取一个重启任务,执行该次局部搜索。在搜索过程中,当需要评估一个邻居的代价时,工作线程将数据点分区分配给多个子线程(或利用数据并行库)并行计算各点到候选中心点的距离及总和。
- 同步与结果收集:每次重启任务完成后,工作线程将找到的局部最优解(中心点集合及其代价)返回给主进程。主进程收集所有结果,选择代价最小的解作为最终输出。
- 主进程:管理重启任务。创建
-
并行算法步骤详解
假设有P个并行工作进程(或线程),数据集D包含N个点,要聚为K类。- 步骤1:主进程将数据集D广播给所有工作进程(或存储在共享文件系统/分布式存储中,每个进程可本地访问)。
- 步骤2:主进程生成
num_restart个重启任务,每个任务包含一个随机生成的初始中心点集合(大小为K)。 - 步骤3:工作进程并行处理重启任务。对于每个任务,执行以下循环:
a. 从当前中心点集合current_medoids出发,设置计数器counter = 0。
b. 当counter < max_neighbor时重复:- 随机选择一个非中心点
p_non和一个中心点p_med,生成邻居中心点集合neighbor_medoids(将p_med替换为p_non)。 - 并行计算代价
cost_neighbor:将数据点D划分为多个块,分配给多个子线程并行计算每个点到neighbor_medoids中最近中心点的距离,然后求和。 - 同样方式计算当前代价
cost_current(可缓存以避免重复计算)。 - 如果
cost_neighbor < cost_current,则current_medoids = neighbor_medoids,cost_current = cost_neighbor,并重置counter = 0;否则counter++。
c. 当counter达到max_neighbor时,当前任务结束,返回current_medoids和cost_current。
- 随机选择一个非中心点
- 步骤4:主进程收集所有工作进程返回的
(current_medoids, cost_current),选择cost_current最小的那个current_medoids作为最终的中心点集合。 - 步骤5(可选):根据最终中心点集合,并行分配每个点到最近中心点,形成K个簇。
-
复杂度与优化考虑
- 时间复杂度:串行CLARANS每次邻居评估需O(NK)时间计算距离。并行化后,邻居评估通过数据并行可降至O(NK / T),其中T为子线程数。重启任务并行可进一步将总时间降至约串行时间的1/P(忽略通信开销)。
- 通信开销:在分布式内存系统中,广播数据集和收集结果有通信成本。可考虑将数据预先分区存储在各节点,仅交换中心点和代价。
- 负载均衡:重启任务间独立,负载均衡良好。但需注意每个重启任务的搜索步数可能不同,可采用动态任务调度(如工作窃取)来平衡。
- 随机性:由于算法随机性,并行运行可能比串行探索更多解空间,有时甚至得到更好解。
-
示例与总结
假设有一个包含100万个点的数据集,K=10,使用串行CLARANS设置num_restart=10,max_neighbor=100,每次重启平均评估1000个邻居,总评估次数为101000=10^4次,每次评估需计算100万10=10^7次距离,总计算量巨大。
并行化后,使用10台机器(P=10),每台机器有8个核心(T=8)。则重启任务并行使任务时间降至1/10,数据并行使每次邻居评估时间降至1/8,总体加速比理论可达80倍,显著缩短聚类时间。通过将CLARANS算法的重启任务和邻居评估并行化,我们构建了一个高效的并行K-中心点聚类算法,能够处理大规模数据,同时保持了算法的启发式搜索能力和鲁棒性。