我尝试比较多达数千个估计的 beta 分布。每个 beta 分布的特征在于两个形状参数 alpha 和 beta。我现在从每个分布中抽取 100,000 个样本。作为最终结果,我想在每个样本抽取中获得概率最高的分布顺序。我的第一种方法是使用 lapply 生成 N * NDRAWS 数值矩阵,当 N 超过 10,000 时,这会消耗太多内存。(10,000 * 100,000 * 8 字节)
因此,我决定使用顺序方法对每次抽奖进行排序,然后对所有抽奖的顺序求和并得到最终顺序,如下例所示:
set.seed(12345)
N=100
NDRAWS=100000
df <- data.frame(alpha=sample(1:20, N, replace=T), beta=sample(1:200, N, replace=T))
vec <- vector(mode = "integer", length = N )
for(i in 1:NDRAWS){
# order probabilities after a single draw for every theta
pos <- order(rbeta(N, shape1=df$alpha, shape2=df$beta) )
# sum up winning positions for every theta
vec[pos] <- vec[pos] + 1:N
}
# order thetas
ord <- order(-vec)
df[ord,]
这仅消耗 N * 4 字节的内存,因为没有巨型矩阵,而是长度为 N 的单个向量。我现在的问题是,如何利用我的降雪(或任何其他多核包)加速此操作4个CPU核心,而不是只使用一个核心???
# parallelize using snowfall pckg
library(snowfall)
sfInit( parallel=TRUE, cpus=4, type="SOCK")
sfLapply( 1:NDRAWS, function(x) ?????? )
sfStop()
任何帮助表示赞赏!