我试图说明当有一种不丢弃样本的替代方法可用时,拒绝抽样是低效的。(这篇文章显然是迁移到 SO 的候选者,但我觉得它可能还有一个统计方面。)
我的例子是模拟随拒绝算法而变化,并且 rbeta(N,2,2)
. 我的代码如下:
# densityatmode <- dbeta(.5,2,2)=1.5
rejectionsampling_beta22 <- function(N){
px <- runif(N,min=0,max=1)
py <- runif(N,min=0,max=1.5)
ikeep <- (py < 6*px*(1-px))
return(px[ikeep])
}
samples <- 1500000
接受概率area under density/area in box
当然area under density
等于 1,因此是 1/1.5,或者等效地,当使用拒绝时,我们需要 1.5 个候选样本。
library(microbenchmark)
result <- microbenchmark(rejectionsampling_beta22(1.5*samples),rbeta(samples,2,2))
结果令我惊讶,因为我觉得拒绝 1/3 的平局应该是浪费:
Warning message:
In microbenchmark(rejectionsampling_beta22(1.5 * samples), rbeta(samples, :
Could not measure a positive execution time for 33 evaluations.
> result
Unit: nanoseconds
expr min lq mean median uq max neval cld
rejectionsampling_beta22(1.5 * samples) 180171443 254891504 248482870.58 257005186 258866373 329533988 100 b
rbeta(samples, 2, 2) 253091893 254717640 261602707.69 257391248 259902160 333055032 100 c
neval 0 0 63.97 1 1 604 100 a