作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想生成一些大型随机多元(超过 6 个维度)正态样本。在 R 中,很多包都可以做到这一点,例如 rmnorm、rmvn...但问题是速度!所以我尝试通过Rcpp编写一些C代码。我在网上浏览了一些教程,但似乎没有用于多元分布的“糖”,STL 库中也没有。
感谢任何帮助!
谢谢!
最佳答案
我不确定 Rcpp 是否会有帮助,除非您找到一个好的算法来近似您的多元变量(cholesky、svd 等)并使用 Eigen (RccpEigen) 或 Armadillo(使用 RcppArmadillo)对其进行编程。
这是一种使用 Cholesky 分解和 (Rcpp)Armadillo 的方法
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
using namespace arma;
using namespace Rcpp;
mat mvrnormArma(int n, mat sigma) {
int ncols = sigma.n_cols;
mat Y = randn(n, ncols);
return Y * chol(sigma);
}
现在是纯 R 中的简单实现
mvrnormR <- function(n, sigma) {
ncols <- ncol(sigma)
matrix(rnorm(n * ncols), ncol = ncols) %*% chol(sigma)
}
您还可以检查一切是否正常
sigma <- matrix(c(1, 0.9, -0.3, 0.9, 1, -0.4, -0.3, -0.4, 1), ncol = 3)
cor(mvrnormR(100, sigma))
cor(MASS::mvrnorm(100, mu = rep(0, 3), sigma))
cor(mvrnormArma(100, sigma))
现在让我们对其进行基准测试
require(bencharmk)
benchmark(mvrnormR(1e4, sigma),
MASS::mvrnorm(1e4, mu = rep(0, 3), sigma),
mvrnormArma(1e4, sigma),
columns=c('test', 'replications', 'relative', 'elapsed'))
## 2 MASS::mvrnorm(10000, mu = rep(0, 3), sigma) 100
## 3 mvrnormArma(10000, sigma) 100
## 1 mvrnormR(10000, sigma) 100
## relative elapsed
## 2 3.135 2.295
## 3 1.000 0.732
## 1 1.807 1.323
在此示例中,我使用了具有单位方差和零均值的正态分布,但您可以轻松地推广到具有自定义均值和方差的高斯分布。
希望这有帮助
关于c - Rcpp 如何在Rcpp中生成随机多元法 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15263996/
我是一名优秀的程序员,十分优秀!