在R中进行快速采样

14

是否有比base::sample函数更快的方法来进行无重复随机子样本抽取?

4个回答

18

通过消除 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 
根据你的问题,可能有其他更聪明的方法来加速你的代码。考虑用一个大的调用来代替许多小的“sample”调用。

1
+1 表示建议问题可能是对 sample 进行了大量的小调用。 - Aniko
1
将多个调用替换为一个 +1 -- 我需要将一个 2.35 亿人口分成随机的每组 15 万人。起初我尝试单独对每个组进行抽样,但那将需要一整天的时间,所以我只进行了一次抽样:population <- sample(population, length(population))然后进行分块。半小时内完成。 - Zachary Ryan Smith

4

dqrng 包解决了 R 中更快的采样问题。 以下是一个示例和基准测试:

library(dqrng)
library(bench)

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),
                  check = FALSE, 
                  iterations = 3)
bm

# # A tibble: 2 x 13
#   expression      min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time
#   <bch:expr> <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm>
# 1 samp          6.37s    6.59s     0.153    1.12GB    0.153     3     3     19.56s
# 2 dqsamp        1.07s    1.43s     0.723    1.12GB    0.482     3     2      4.15s
# # ... with 4 more variables: result <list>, memory <list>, time <list>, gc <list>

这里有一篇相关的博客文章:https://www.r-bloggers.com/2019/04/fast-sampling-support-in-dqrng/


1
哇塞!这速度真快。作为一个需要执行数百万个 sample() 调用的人,这让我的生活质量大大提高了!谢谢! - pallevillesen
1
不错。两个评论:1)dqrng 0.3.1支持dqrrademacher,在您的情况下应该更快。2)楼主要求无替换抽样。dqrng的优势在那方面会更大。 - Ralf Stubner

2

不行

在我的笔记本电脑上,使用替换方式可以在3毫秒内获取1万个样本。如果不使用替换,则需要5毫秒。从500个分布中多次抽取需要66毫秒。您需要它有多快?


1
扩大规模到1e8-1e9,你会看到它的可扩展性有多糟糕。 - jangorecki
由于内存问题,当数据量达到10亿时,它的扩展性变差。此外,请记住这些答案是9年前的。你应该在我们现在拥有的非常不同版本的R上进行自己的测试。 - John
1
我的关于1e8-1e9的反思基于R 4.0.3和R-devel,具有充足的RAM内存。 - jangorecki

-1

除了使用CUDA/gputools,你不会找到更快的方法。


请注意,这是一条注释而不是答案。请展示如何使用CUDA/gputools进行操作。 - Brandon Bertelsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接