我想知道如何在 matlab 中绘制样本,其中我有精度矩阵和均值作为输入参数。
我知道 mvnrnd 是这样做的典型方法,但它需要协方差矩阵(即精度的倒数))作为参数。
我只有精度矩阵,由于计算问题,我无法反转我的精度矩阵,因为它需要太长时间(我的尺寸约为 2000*2000)
我想知道如何在 matlab 中绘制样本,其中我有精度矩阵和均值作为输入参数。
我知道 mvnrnd 是这样做的典型方法,但它需要协方差矩阵(即精度的倒数))作为参数。
我只有精度矩阵,由于计算问题,我无法反转我的精度矩阵,因为它需要太长时间(我的尺寸约为 2000*2000)
好问题。请注意,您可以通过相关 Wikipedia 文章中描述的过程,使用来自标准正态分布的样本从多元正态分布生成样本。
基本上,这归结为评估从标准正态分布中采样的独立随机变量的向量A*z + mu
在哪里,是一个均值向量,并且是协方差矩阵。由于您有后一个数量的倒数,即,您可能可以进行 Cholesky 分解(请参阅)来确定 的倒数。然后,您需要评估. 如果您只知道这仍然可以在不执行矩阵求逆的情况下通过求解线性系统(例如通过反斜杠运算符)来完成。z
mu
A*A' = Sigma
inv(Sigma)
chol
A
A * z
inv(A)
Cholesky 分解对您来说可能仍然存在问题,但我希望这会有所帮助。
如果要从 N(μ,Q -1 ) 中采样并且只有 Q 可用,则可以对 Q, L 进行 Cholesky 分解,使得 LL T =Q。接下来从标准正态分布 N(0, I)中取 L T、 L -T和样本 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];
亩=[100; 2];
% 获取精度矩阵
Q = inv(covm);
%取Q的Cholesky分解(matlab中的chol已经返回上三角因子)
L = 科尔(Q);
% 从标准二元正态分布中抽取 2000 个样本
Z = normrnd(0,1, [2, 2000]);
%求解系统并添加平均值
X = repmat(mu, 1, 2000)+L\Z;
%检查结果
平均值(X')
变量(X')
校正系数(X')
% 与协方差矩阵中的采样进行比较
Y=mvnrnd(mu,covm, 2000)';
均值(Y')
各不相同')
校正系数(Y')
分散(X(1,:),X(2,:),'b')
坚持,稍等
分散(Y(1,:),Y(2,:),'r')
为了提高效率,我想您可以搜索一些可以有效解决三角系统的包。