gpt4 book ai didi

r - 从多元正态分布中有效地随机抽取

转载 作者:行者123 更新时间:2023-12-04 17:35:07 24 4
gpt4 key购买 nike

只是想知道是否有人遇到过他/她需要从非常高维的多元正态分布(比如维数 = 10,000)中随机抽取的问题,如 rmvnorm mvtnorm的功能包是不切实际的。

我知道这个 article有一个 Rcpp dmvnorm 的实现mvtnorm的功能包,所以我想知道 rmvnorm 是否存在等效的东西?

最佳答案

这是 mvtnorm::rmvnorm 的快速比较和一个 Rcpp给出的实现 here艾哈迈杜·迪科 (Ahmadou Dicko)。显示的时间是从维度范围从 500 到 2500 的多元正态分布中抽取 100 次的时间。从下图中您大概可以推断出维度为 10000 所需的时间。时间包括生成随机 mu 的开销。矢量和 diag矩阵,但这些在各种方法中是一致的,并且对于所讨论的维度来说是微不足道的(例如 diag(10000) 为 0.2 秒)。

library(Rcpp)
library(RcppArmadillo)
library(inline)
library(mvtnorm)

code <- '
using namespace Rcpp;
int n = as<int>(n_);
arma::vec mu = as<arma::vec>(mu_);
arma::mat sigma = as<arma::mat>(sigma_);
int ncols = sigma.n_cols;
arma::mat Y = arma::randn(n, ncols);
return wrap(arma::repmat(mu, 1, n).t() + Y * arma::chol(sigma));
'

rmvnorm.rcpp <-
cxxfunction(signature(n_="integer", mu_="numeric", sigma_="matrix"), code,
plugin="RcppArmadillo", verbose=TRUE)

rcpp.time <- sapply(seq(500, 5000, 500), function(x) {
system.time(rmvnorm.rcpp(100, rnorm(x), diag(x)))[3]
})

mvtnorm.time <- sapply(seq(500, 2500, 500), function(x) {
system.time(rmvnorm(100, rnorm(x), diag(x)))[3]
})


plot(seq(500, 5000, 500), rcpp.time, type='o', xlim=c(0, 5000),
ylim=c(0, max(mvtnorm.time)), xlab='dimension', ylab='time (s)')

points(seq(500, 2500, 500), mvtnorm.time, type='o', col=2)

legend('topleft', legend=c('rcpp', 'mvtnorm'), lty=1, col=1:2, bty='n')

enter image description here

关于r - 从多元正态分布中有效地随机抽取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com