2009-09-10 137 views

回答

9
  • 使用多個內核/機器應該是簡單的,如果你僅僅使用平行獨立的重複,但要注意隨機數生成器的常見缺陷(例如,如果使用當前時間作爲種子,產卵許多過程一個RNG每個可能會產生相關的隨機數,從而導致無效的結果 - 例如見this paper

  • 您可能需要使用variance reduction減少所需的複製,即數量縮小所需樣本的大小。更多先進的方差減少技術可以在許多教科書中找到,例如,在this one

3

拉丁超立方體採樣很容易應用,對結果有很大影響。基本上,您可以從統一分佈中獲取拉丁超立方體樣本(例如,在包中使用randomLHS()),並使用例如qnorm(uniformsample)將其轉換爲您所需的分佈。

5

Preallocate your vectors!

> nsims <- 10000 
> n <- 100 
> 
> system.time({ 
    res <- NULL 
    for (i in 1:nsims) { 
     res <- c(res,mean(rnorm(n))) 
    } 
}) 
    user system elapsed 
    0.761 0.015 0.783 
> 
> system.time({ 
    res <- rep(NA, nsims) 
    for (i in 1:nsims) { 
     res[i] <- mean(rnorm(n)) 
    } 
}) 
    user system elapsed 
    0.485 0.001 0.488 
> 
+0

我在模型中使用這只是昨天它將我的運行時間縮短了15%以上。當然值得一行代碼。 – 2009-09-11 15:23:53

+0

這是一個偉大的小竅門 – Dan 2009-09-11 17:43:28

3

我知道這個線程是真的老了,但如果有人絆倒,並正在尋找更快的方法,我認爲以下工作:

library(data.table) 
library(microbenchmark) 

nsims <- 10000 
n <- 100 

# Answer from @Eduardo_Leoni: 
preallocate<-function(nsims, n) { 
    res <- rep(NA, nsims) 
    for (i in 1:nsims) { 
    res[i] <- mean(rnorm(n)) 
    } 
    return(res) 
} 

# Answer using data.table: 
datatable<-function(nsims,n) { 
    dt <- data.table(i=1:nsims)[,list(res=mean(rnorm(1:n))),by=i] 
    return(dt) 
} 

# Timing benchmark: 
microbenchmark(preallocate(nsims,n), datatable(nsims,n), times=100) 
#Unit: milliseconds 
#     expr  min  lq median  uq  max neval 
# preallocate(nsims, n) 428.4022 432.3249 434.2910 436.4806 489.2061 100 
# datatable(nsims, n) 238.9006 242.3517 244.1229 246.5998 303.6133 100 
+1

你應該在同一臺計算機上運行你的解決方案和其他人(因爲一些計算機比其他計算機更快)。我發現你比'microbenchmark'的循環慢了一點;和'replicate(nsims,mean(rnorm(1:n)))'稍快一點。這在兩種情況下都有3%的差異。 – Frank 2013-09-02 14:01:08

+1

感謝您的建議,@Frank,並看到編輯的答案。在我的系統上,'data.table'使得@Eduardo_Leoni的循環解決方案的速度提高了〜1.8倍。請讓我知道,如果我失去了一些東西,因爲我絕對不是基準測試的細微差別的專家...... – dnlbrky 2013-09-07 12:43:57

+0

非常有幫助。使用這個技巧,我將計算時間從250秒減少到了60秒。 – 2014-08-04 03:20:28