从多元高斯分布生成值

机器算法验证 matlab 算法 随机生成 多元正态分布
2022-02-05 13:13:36

我目前正在尝试模拟 a 的值N维随机变量X具有均值向量的多元正态分布μ=(μ1,...,μN)T和协方差矩阵S.

我希望使用类似于逆 CDF 方法的过程,这意味着我想首先生成一个N维均匀随机变量U然后将其代入该分布的逆 CDF,从而产生价值X.

我遇到了问题,因为该过程没有得到很好的记录,并且MATLAB 中的 mvnrnd 函数与我在 Wikipedia 上找到的描述之间存在细微差别

就我而言,我也是随机选择分布的参数。特别是,我生成了每一种手段,μi, 从均匀分布U(20,40). 然后我建立协方差矩阵S使用以下程序:

  1. 创建下三角矩阵L在哪里L(i,i)=1为了i=1..NL(i,j)=U(1,1)为了 i<j

  2. S=LLT在哪里LT表示转置L.

这个程序让我可以确保S是对称且正定的。它还提供了一个下三角矩阵L以便S=LLT,我认为这是从分布中产生价值所必需的。

使用维基百科上的指南,我应该能够生成X用一个N维均匀如下:

  • X=μ+LΦ1(U)

然而,根据 MA​​TLAB 函数,这通常是这样完成的:

  • X=μ+LTΦ1(U)

在哪里Φ1是 a 的逆 CDFN维,可分,正态分布,两种方法唯一的区别就是是否使用L或者LT.

MATLAB 或 Wikipedia 是要走的路吗?还是两者都错了?

1个回答

如果XN(0,I)是标准法线 RV 的列向量,那么如果您设置Y=LX, 的协方差YLLT.

我认为您遇到的问题可能源于 matlab 的mvnrnd函数将行向量作为样本返回,即使您将平均值指定为列向量也是如此。例如,

 > size(mvnrnd(ones(10,1),eye(10))  
 > ans =
 >      1    10

请注意,转换行向量会为您提供相反的公式。如果X是一个行向量,那么Z=XLT也是一个行向量,所以ZT=LXT是一个列向量,协方差ZT可以写E[ZTZ]=LLT.

根据您所写的内容,维基百科的公式是正确的:如果Φ1(U)是matlab返回的行向量,你不能左乘它LT. (但右乘LT会给你一个具有相同协方差的样本LLT)。