如何从matlab中精确参数化的多元高斯分布中抽取样本

时间:2013-05-23 05:28:07

标签: matlab matrix probability

我想知道如何在matlab中绘制样本,其中我有精确矩阵和mean作为输入参数。

我知道mvnrnd是一种典型的方法,但它需要协方差矩阵(即精度的倒数)作为参数。

我只有精确矩阵,由于计算问题,我无法反转我的精度矩阵,因为它需要太长时间(我的尺寸约为2000 * 2000)

2 个答案:

答案 0 :(得分:7)

好问题。请注意,您可以使用标准正态分布中的样本,通过the relevant Wikipedia article中描述的过程,从多变量正态分布生成样本。

基本上,这归结为评估A*z + mu,其中z是从标准正态分布中采样的独立随机变量的向量,mu是均值向量,{{1是协方差矩阵。由于您具有后一个数量的倒数,即A*A' = Sigma,您可以进行Cholesky分解(请参阅chol)以确定inv(Sigma)的倒数。然后,您需要评估A。如果您只知道A * z这仍然可以在不执行矩阵求逆的情况下通过改为求解线性系统(例如通过反斜杠运算符)来完成。

Cholesky分解对你来说可能仍有问题,但我希望这会有所帮助。

答案 1 :(得分:1)

如果你想从N(μ,Q -1 )中取样并且只有Q可用,你可以采用Q,L的Cholesky因子分解,使LL T = Q。接下来取L T ,L -T 的倒数,并从标准正态分布N(0,I)取样Z.

考虑到L -T 是上三角形dxd矩阵,Z是d维列向量, μ+ L -T Z将分布为N(μ,Q -1 )。

如果你想避免取L的倒数,你可以通过反向替换求解三角方程组L T v = Z.然后μ+ v将分布为N(μ,Q -1 )。

一些说明性的matlab代码:

%制作2x2协方差矩阵和平均向量

covm = [3 0.4 *(sqrt(3 * 7)); 0.4 *(sqrt(3 * 7))7];

mu = [100; 2];

%获取精度矩阵

Q = inv(covm);

%采用Q的Cholesky分解(matlab中的chol已经返回上三角因子)

L = chol(Q);

%从标准二元正态分布中抽取2000个样本

Z = normrnd(0,1,[2,2000]);

%解决系统并添加平均值

X = repmat(mu,1,2000)+ L \ Z;

%检查结果

平均值(X')

变种(X')

corrcoef(X')

%与协方差矩阵的采样相比

Y = mvnrnd(mu,covm,2000)';

平均值(Y')

变种(Y')

corrcoef(Y')

分散(X(1,:),X(2,:),'b')

坚持

分散(Y(1,:),Y(2,:),'r')

为了提高效率,我想你可以搜索一些有效解决三角形系统的软件包。