【问题标题】:Given a covarince matrix, generate a Gaussian random variable in Matlab给定一个协方差矩阵,在 Matlab 中生成一个高斯随机变量
【发布时间】:2013-09-25 02:32:59
【问题描述】:

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

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

【问题讨论】:

  • 是的,只需对R 进行 Cholesky 分解,并预乘一个 i.i.d。 (即randn)矩阵。
  • 添加到@OliCharlesworth 的评论中:sitmo.com/article/generating-correlated-random-numbers
  • @LuisMendo,我认为他使用特征向量分解计算时有错误,但chol 转换看起来不错
  • 注意相关矩阵≠协方差矩阵。相关矩阵是归一化协方差矩阵。如果您使用chol,您应该确保您使用的是相关矩阵。否则,对于更一般的情况,cholcov

标签: matlab statistics probability


【解决方案1】:

如果您可以访问 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

【讨论】:

    【解决方案2】:

    例子:

    % 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')
    

    以上代码使用统计工具箱中的函数(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));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多