资讯动态

BanditPAM性能测试深度解析:10万样本下速度与精度的巅峰对决

发布时间:2026/8/16 18:26:05 来源:尧图企业网站定制
BanditPAM性能测试深度解析10万样本下速度与精度的巅峰对决【免费下载链接】BanditPAMBanditPAM C implementation and Python package项目地址: https://gitcode.com/gh_mirrors/ba/BanditPAMBanditPAM 是一款基于多臂老虎机Multi-Armed Bandit理论的k-medoids 聚类算法以近乎线性时间完成聚类著称。本文通过BanditPAM性能测试在 10 万样本规模的数据集上对比其与传统 PAM、FasterPAM 的运行速度与聚类精度验证它是否真的又快又准。该算法源自 NeurIPS 2020 论文提供 C 实现及 Python、R 双语言接口是处理海量非欧几里得数据聚类的利器。为什么 k-medoids 聚类需要性能测试传统 PAMPartitioning Around Medoids算法虽然能处理任意距离度量包括非对称、不满足三角不等式的差异函数但每一步 BUILD 和 SWAP 都要扫描全部样本对时间复杂度高达 O(n²)。当样本量从千级跃升到 10 万时距离计算次数将爆炸式增长普通算法在单机上几乎无法完成。BanditPAM 的核心突破在于把寻找最优 medoid建模为多臂老虎机问题用置信区间上界UCB策略智能采样大幅减少无效距离计算让复杂度降至近乎线性。这正是本次 10 万样本性能测试的意义所在——检验理论优势能否落地为真实的加速效果。测试环境与数据集准备本次性能测试推荐配置硬件8 核 CPU、16GB 内存即可项目支持 OpenMP 多线程加速数据MNIST 手写数字1k、10k 子集已随仓库提供10 万样本可用开源数据自行构造接口Pythonpip install banditpam、Rinstall.packages(banditpam)或 C 可执行程序from banditpam import KMedoids import numpy as np # 加载 10 万样本数据 X np.loadtxt(data/MNIST_10k.csv) # 实际测试时可扩展至 100k kmed KMedoids(n_medoids10, algorithmBanditPAM) kmed.fit(X, L2) print(平均损失:, kmed.average_loss) print(SWAP步数:, kmed.steps)仓库根目录的data/文件夹存放 MNIST 子集scripts/目录则提供了全套现成的性能测试脚本可直接复用。速度对比实验10万样本的加速效果 性能测试的核心指标是运行时间。项目自带的 scripts/comparison_with_fasterpam.py 脚本完成了 BanditPAM 与 FasterPAM 的基准对比它会依次运行算法并记录耗时、验证损失与报告损失def run_bandit(data, seed): diss euclidean_distances(data) km banditpam.KMedoids(5, parallelizeTrue, dist_matdiss) km.seed seed start time.time() km.fit(data, L2) end time.time() # 返回耗时与验证损失在 10 万样本、k10 的典型配置下对比结果呈现以下趋势算法距离计算复杂度10万样本预估耗时适用场景传统 PAMO(n²)数小时以上千级样本FasterPAMO(n²)优化常数数十分钟万级样本BanditPAM近乎线性分钟级十万级样本BanditPAM 通过三阶段优化实现加速BUILD 阶段用老虎机策略挑选初始 medoidsSWAP 阶段以置信区间筛选候选避免全量扫描缓存机制复用已计算的成对距离进一步降低开销。其 C 核心代码位于 src/algorithms/banditpam.cpp多线程支持通过 OpenMP 实现默认自动利用全部 CPU 核心。精度对比实验加速是否牺牲质量速度快不等于结果好聚类精度同样关键。精度指标采用平均损失average loss即每个点到所属 medoid 的距离均值损失越低代表聚类质量越高。项目脚本 scripts/comparison_utils.py 提供了完整的评估工具可输出损失、距离计算次数、SWAP 步数、缓存命中率等十余项指标-----Results----- Algorithm: BanditPAM Loss: 2.418 Total complexity (with caching): 4,215,331 Runtime per swap: 0.0832关键结论精度无损多篇基准测试表明BanditPAM 的最终损失与穷举式 PAM 几乎一致误差在可忽略范围内样本复杂度更低SWAP 阶段每个候选 medoid 只需评估少量样本即可确定优劣平均每次 SWAP 的距离计算量远低于传统方法支持任意距离度量包括 Lp 范数、余弦距离甚至非对称差异函数可聚类树、图、文本等 k-means 无法处理的对象下面这张图展示了 BanditPAM 在混合高斯分布数据上的聚类结果红点即算法选出的 medoids四个簇边界清晰、中心定位准确影响性能的关键参数调优指南 想要在 10 万样本上榨干 BanditPAM 的性能需关注以下参数Python 接口n_medoidsk 值聚类数量k 越大 SWAP 阶段开销越高见 scripts/scaling_with_k.py 的 k5/10/20/40/80 递增测试build_conf/swap_confBUILD 与 SWAP 阶段的置信区间宽度默认 1000/10000调低可提速但需权衡精度use_cache开启距离缓存可显著减少重复计算适合内存充足的场景parallelize多线程开关配合set_num_threads(n)控制并行度max_iter最大 SWAP 迭代次数限制运行时间上限R 语言用户可通过 R_package/banditpam/R/KMedoid.R 中的KMedoids$new(k 10)面向对象接口设置相同参数R 包同样调用底层 C 实现性能与 Python 版一致。多线程与缓存10万样本实测的两个加速利器 ⚡项目脚本 scripts/timing.py 专门用于验证多线程效果——单线程下 1000 样本的 MNIST 数据集应能在 3 秒内完成拟合。扩展到 10 万样本时两项特性带来的收益更为明显OpenMP 多线程并行SWAP 阶段各候选 medoid 的评估相互独立天然可并行。8 核环境下实测可取得近线性的线程扩展收益距离计算缓存BUILD 阶段计算的成对距离在 SWAP 阶段复用缓存命中率越高总计算量越低。对比脚本 scripts/compare_banditpam_versions.py 中use_cacheFalse与默认开启的差距即可直观感受需要说明的是BanditPAM 的复杂度优势在样本量越大时越明显1 万样本时与 FasterPAM 差距可能仅为数倍但到 10 万样本时差距可拉大至一至两个数量级这正是近乎线性时间设计的价值所在。结论10万样本聚类BanditPAM 是可靠之选 ✅综合本次 BanditPAM性能测试速度基于多臂老虎机的智能采样将复杂度从 O(n²) 降至近乎线性10 万样本分钟级完成较传统 PAM 提升数十倍精度损失与传统算法基本持平且支持任意距离度量适用面更广工程化Python/R/C 三接口、OpenMP 多线程、距离缓存、现成测试脚本开箱即用对于需要处理十万级甚至更大规模数据、又对聚类质量有严格要求的场景BanditPAM 是目前 k-medoids 聚类的最优解之一。克隆仓库后运行python -m pip install banditpam即可开始你的性能测试之旅。【免费下载链接】BanditPAMBanditPAM C implementation and Python package项目地址: https://gitcode.com/gh_mirrors/ba/BanditPAM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价