在Matlab中,给定协方差矩阵,生成高斯随机变量

4
给定一个大小为 M x M 的协方差矩阵 R 和样本向量数量 N,在普通的MATLAB中(即不能使用r = mvnrnd(MU,SIGMA,cases)),计算一个大小为 N x M 的高斯随机向量 X。不太确定如何处理,通常需要具有协方差和均值才能生成高斯随机变量。我认为sqrtmchol可能会有用。

4
好的,只需对 R 进行 Cholesky 分解,然后预乘以一个独立同分布的(即 randn)矩阵即可。 - Oliver Charlesworth
2
补充@OliCharlesworth的评论:http://www.sitmo.com/article/generating-correlated-random-numbers/ - Luis Mendo
@LuisMendo,我认为在使用特征向量分解进行计算时存在错误,但“chol”转换看起来不错。 - Elpezmuerto
2
请注意,相关矩阵≠协方差矩阵。相关矩阵是归一化的协方差矩阵。如果您使用chol,请确保您正在使用相关矩阵。否则,更一般的情况下可以使用cholcov - horchler
2个回答

3
如果您可以访问MATLAB统计工具箱,您可以在MATLAB中键入edit mvnrnd来查看他们的解决方案。
[T p] = chol(sigma);
if m1 == c
  mu = mu';
end
mu = mu(ones(cases,1),:);
r = randn(cases,c) * T + mu;

我觉得这样说几乎是作弊,但编辑MATLAB源代码非常有用,可以帮助我们更好地理解问题。如果你没有工具箱,也可以在谷歌上搜索mvnrnd.m


3

例子:

% Gaussian mean and covariance
d = 2;             % number of dimensions
mu = rand(1,d);
sigma = rand(d,d); sigma = sigma*sigma';

% generate 100 samples from above distribution
num = 100;
X = mvnrnd(mu, sigma, num);

% plot samples (only for 2D case)
scatter(X(:,1), X(:,2), 'filled'), hold on
ezcontour(@(x,y) mvnpdf([x y], mu, sigma), xlim(), ylim())
title('X~N(\mu,\sigma)')
xlabel('X_1'), ylabel('X_2')

2d gaussian samples

上述代码使用了统计工具箱中的函数(mvnrndmvnpdf)。如果您无法访问该工具箱,请考虑使用以下替代方案(使用其他人提到的相同概念):
mvnrnd = @(mu,S,num) bsxfun(@plus, randn(num,numel(mu))*cholcov(S), mu);

mvnpdf = @(x,mu,S) exp(-0.5*(x-mu)*(S\(x-mu)')) / sqrt((2*pi)^d*det(S));

multivariate normal distribution PDF


有趣的内容:http://blogs.sas.com/content/iml/2012/02/08/use-the-cholesky-transformation-to-correlate-and-uncorrelate-variables/ - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接