簡體   English   中英

降雪中R的並行蒙特卡羅模擬

[英]Parallel Monte Carlo Simulation in R using snowfall

我嘗試比較多達數千個估計的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()

任何幫助表示贊賞!

這可以以與並行化隨機林或引導的方式相同的方式進行並行化。 您只需對每個工作程序執行順序代碼,但每個工作程序使用較少的迭代次數。 這比將for循環的每次迭代分成單獨的並行任務要有效得多。

這是您轉換為使用帶有doParallel后端的foreach包的完整示例:

set.seed(12345)
N=100
NDRAWS=100000
df <- data.frame(alpha=sample(1:20, N, replace=T),
                 beta=sample(1:200, N, replace=T))
library(doParallel)
nworkers <- detectCores()
cl <- makePSOCKcluster(nworkers)
clusterSetRNGStream(cl, c(1,2,3,4,5,6,7))
registerDoParallel(cl)

vec <- foreach(ndraws=rep(ceiling(NDRAWS/nworkers), nworkers),
               .combine='+') %dopar% {
  v <- integer(N)
  for(i in 1:ndraws) {
    pos <- order(rbeta(N, shape1=df$alpha, shape2=df$beta) )
    v[pos] <- v[pos] + 1:N
  }
  v
}
ord <- order(-vec)
df[ord,]

請注意,這會產生與順序版本不同的結果,因為工作人員會生成不同的隨機數。 我使用並行包提供的並行隨機數支持,因為這是一種很好的做法。

嗯,功能就在那里。 我不確定你每次迭代都要返回什么。

也許試試這個?

myFunc <- function(xx, N) {
  pos <- order(rbeta(N, shape1=df$alpha, shape2=df$beta) )
  vec[pos] + 1:N
}

使用doParallel將允許您添加結果:

require(doParallel)
registerDoParallel(cores=4)
foreach(i=1:NDRAWS, .combine='+') %dopar% myFunc(i, N)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM