سؤال

عندما أقوم بإجراء عمليات محاكاة مونت كارلو على نطاق واسع في S-Plus، ينتهي بي الأمر دائمًا بإطلاق لحيتي أثناء انتظار اكتمالها.

ما هي أفضل الحيل لتشغيل محاكاة مونتي كارلو في R؟هل هناك أي أمثلة جيدة على تشغيل العمليات بطريقة موزعة؟

هل كانت مفيدة؟

المحلول

  • يجب أن يكون استخدام النوى/الآلات المتعددة أمرًا بسيطًا إذا كنت تستخدمه فقط النسخ المتماثلة المستقلة المتوازية, ، ولكن كن على دراية بأوجه القصور الشائعة في مولدات الأرقام العشوائية (على سبيل المثال:إذا تم استخدام الوقت الحالي كبذرة، فإن إنتاج العديد من العمليات باستخدام RNG واحد لكل منها قد ينتج عنه أرقام عشوائية مترابطة، مما يؤدي إلى نتائج غير صالحة - انظر على سبيل المثال هذه الورقة)

  • قد ترغب في استخدام تقليل التباين ل تقليل عدد التكرارات المطلوبة, ، أي.لتقليص حجم العينة المطلوبة.يمكن العثور على تقنيات أكثر تقدما للحد من التباين في العديد من الكتب المدرسية، على سبيل المثال.في هذا.

نصائح أخرى

وPreallocate ناقلات الخاص بك!

> 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 
> 

ويتم تطبيقها اللاتينية الزائدي أخذ العينات بسهولة، ولها تأثير كبير على النتائج. اساسا كنت أخذ عينة الزائدي اللاتينية من توزيع موحد (على سبيل المثال، وذلك باستخدام randomLHS () في الطرف الأيسر الحزمة) وتحويل هذا التوزيع المطلوب باستخدام مثل، qnorm (uniformsample).

وأنا أعرف هذا الموضوع القديم حقا، ولكن إذا كان أي شخص يتعثر عليه، وتبحث عن وسيلة أسرع، وأعتقد أن الأعمال التالية:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top