我想知道如何在matlab中绘制样本,其中我有精确矩阵和mean作为输入参数。
我知道mvnrnd是一种典型的方法,但它需要协方差矩阵(即精度的倒数)作为参数。
我只有精确矩阵,由于计算问题,我无法反转我的精度矩阵,因为它需要太长时间(我的尺寸约为2000 * 2000)
答案 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')
为了提高效率,我想你可以搜索一些有效解决三角形系统的软件包。