R中的快速采样

j2datikz  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(64)

是否有比base::sample函数更快的方法来获取随机子样本(无需替换)?

hzbexzde

hzbexzde1#

没有
我可以在3毫秒内在我的笔记本电脑上获得10,000个样本。没有替换,我可以在5 ms内得到它们。从500个分布中多次绘制需要66毫秒。你需要它多快?

11dmarpk

11dmarpk2#

你可以通过消除base::sample函数调用来获得一点加速:

> x<- rnorm(10000)
> system.time(for(i in 1:100000) x[.Internal(sample(10000L, 10L, FALSE, NULL))])
   user  system elapsed 
  2.873   0.017   2.851 
> system.time(for(i in 1:100000) sample(x,10))
   user  system elapsed 
  3.420   0.025   3.258

根据您的问题,可能有其他更聪明的方法来加速代码。想办法用一个大的调用来代替许多小的调用。

avwztpqn

avwztpqn3#

dqrng包解决了R中更快的采样问题。下面是一个示例和基准测试(注意,我已经更新了这些基准测试,以解决Ralf在下面的评论):

library(dqrng)
library(bench)
library(ggplot2)

set.seed(892)
dqset.seed(871)
m <- 1000
n <- 99999
all <- m * n
bm <- bench::mark(samp = sample(x = c(1, -1), size = all, replace = TRUE),
                  dqsamp = dqsample(x = c(1,-1), size = all, replace = TRUE),
                  dqrrademacher = dqrrademacher(n),
                  check = FALSE, 
                  iterations = 3)
bm
plot(bm) + theme_bw()

dqrng要快得多-注意x轴是对数刻度的!
以下是相关的博客:https://www.r-bloggers.com/2019/04/fast-sampling-support-in-dqrng/

相关问题