不确定我的算法是否正确,我正在尝试复制 Matlab 的 mvnrnd 函数,但使用的是 GSL。我在一些期刊文章中发现了一种算法,可以生成多元正态向量,但我需要一个多元正态随机数矩阵
假设分布为 Z~(mu,sigma(;
假设 Sigma 是一个已经是正确定的矩阵。
我在网上找到的一个算法说
1. cholskey(sigma) = A
2. generate uniform gaussian vector r
3. matrix vector triangular product with gsl_blas_dtrmv A * r
4. add mu to Ar and that will be a vector of multivariate normal random numbers
我在下面的方法
是以下更改更正为乘积随机变量矩阵
1. cholskey(sigma) = A
2. generate uniform gaussian matrix R
3. matrix matrix scalar product AR
4. add mu to AR and that will be a matrix of multivariate normal random numbers
是的,这是正确的。例如,请参阅维基百科关于多元正常RNG的条目,其中包含以下部分:
从分布中绘制值
一种广泛使用的方法,用于从 具有平均向量μ和 协方差矩阵 Σ 的工作原理如下:
找到任何实矩阵 A,使得 A AT = Σ。当 Σ 为正定时,乔列斯基分解为 通常使用。[...]
设 z = (z1, ..., zN(T 是一个分量为 N 的向量 独立的标准正态变量(可以生成,用于 例如,通过使用 Box-Muller 变换(。
设 x 为 μ + Az。这有 由于仿射变换属性而产生的所需分布。
它描述了相同的算法。
R还有几种实现,例如mvrnorm
每个R安装附带的MASS包中的实现。