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

时间:2013-09-19 20:27:18

标签: matlab statistics probability

给定M x M期望的协方差,R和所需数量的样本向量,N计算N x M高斯随机向量,X in vanilla MATLAB(即不能使用r = mvnrnd(MU,SIGMA,cases))。

不确定如何解决这个问题,通常你需要一个协方差并且意味着generate a Gaussian random variable。我认为sqrtmchol可能很有用。

2 个答案:

答案 0 :(得分: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的源代码对于理解一般情况非常有用。如果您没有工具箱,也可以在Google上搜索mvnrnd.m

答案 1 :(得分: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