Was ist der beste Trick, um eine Monte-Carlo-Simulation zu beschleunigen? [geschlossen]
-
05-07-2019 - |
Frage
Jedes Mal, wenn ich in großem Maßstab laufen Monte- Carlo-Simulationen in S-Plus, habe ich immer einen Bart am Ende wächst, während ich warten, bis es zu vervollständigen.
Was sind die besten Tricks für die Ausführung von Monte- Carlo-Simulationen in R? Jedes gute Beispiele für Prozesse in einer verteilten Art und Weise ausgeführt wird?
Lösung
-
mehr Kerne mit / Maschinen sollten einfach sein, wenn Sie gerade mit parallel unabhängigen Replikationen , sondern von gemeinsamen Mangel von Zufallszahlengeneratoren bewusst sein (zB wenn die aktuelle Zeit als Saatgut verwendet für jeden viele Prozesse mit einem RNG Laichen könnten Zufallszahlen korreliert erzeugen, die zu ungültige Ergebnisse führt - siehe zB dieses Papier )
-
Sie möchten vielleicht Varianzreduktion reduzieren die Anzahl der verwenden erforderlich Replikationen , dh die Größe der benötigten Probe zu schrumpfen. Fortgeschrittenere Varianzreduktionstechniken können in vielen Lehrbüchern gefunden werden, z.B. in diese .
Andere Tipps
vorbelegen Ihre Vektoren!
> 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
>
Latin Hypercube Sampling ist leicht anzuwenden und hat einen großen Einfluss auf die Ergebnisse. Grundsätzlich nehmen Sie eine Latin Hypercube Probe von einer gleichmäßigen Verteilung (zum Beispiel unter Verwendung von randomLHS () in dem Paket linke Skala) und verwandeln diese auf die gewünschte Verteilung unter Verwendung von zum Beispiel qnorm (uniformsample).
Ich weiß, dass dieser Thread ist wirklich alt, aber wenn jemand auf sie stolpert und sucht eine noch schnellere Methode, denke ich folgende Arbeiten:
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