使用指数变量进行并行采样

如何将看似迭代的无替换加权采样过程转化为高度可并行的过程?事实证明,一种基于指数变量的著名技术正是实现这一点的。

来源:RStudio AI博客

作为我们最近在 sparklyr 中支持 Spark 数据帧加权采样工作的一部分,我们开始寻找可以在分布式集群计算框架(如 Apache Spark)中以高效和可扩展的方式执行加权采样(尤其是无放回采样)的算法。

sparklyr

为简洁起见,“无放回加权采样”将在本博文的其余部分缩写为 SWoR。

SWoR

在以下部分中,我们将解释和说明 SWoR 在概率方面的含义,简要概述我们考虑过但并不完全满意的一些替代解决方案,然后深入研究指数变量,这是一个简单的数学结构,它使这个问题的理想解决方案成为可能。

SWoR

如果您迫不及待地想要开始行动,还有一个部分,其中我们展示了 sparklyr 中 sdf_weighted_sample() 的示例用法。此外,您可以在此拉取请求中查看 sparklyr::sdf_weighted_sample() 的实现细节。

部分 sdf_weighted_sample() sparklyr sparklyr::sdf_weighted_sample() 拉取请求

一切如何开始

我们的旅程始于 Github 问题,询问在 sparklyr 中支持 Spark 数据框的 dplyr::sample_frac(..., weight = ) 等效项的可能性。例如,

Github 问题 dplyr::sample_frac(..., weight = ) sparklyr
dplyr::sample_frac(mtcars, 0.25, weight = gear, replace = FALSE)
dplyr::sample_frac(mtcars, 0.25, weight = gear, replace = FALSE) dplyr::sample_frac(mtcars, 0.25, weight = gear, replace = FALSE) dplyr :: sample_frac sample_frac ( mtcars 0.25 = gear = FALSE ) mtcars$gear dplyr::sample_frac Spark SQL内置函数 sparklyr

SW到底是什么oR

SWoR SWoR \(w_1, \dotsc, w_N\) SWoR \(N\) \(r_1, \dotsc, r_N\) \(w_1, \dotsc, w_N\) \(n\) SWoR \((r_1, \dotsc, r_n)\) \(\prod\limits_{j = 1}^{n} \left( {w_j} \middle/ {\sum\limits_{k = j}^{N}{w_k}} \right) \) SWOR \(n\) \((n - j + 1)\) \(j\) \(j \in \{1, \dotsc, n\}\) SWoR

,

,