【问题标题】:How to compute log of multvariate gaussian in matlab如何在matlab中计算多元高斯的对数
【发布时间】:2014-04-15 01:05:21
【问题描述】:

我正在尝试在 MATLAB 中计算 log(N(x | mu, sigma))

x 是数据向量(Dimensions D x 1) , mu(Dimensions D x 1) 是均值, sigma(Dimensions D x D) 是协方差。

我目前的实现是

function [loggaussian] = logmvnpdf(x,mu,Sigma)

 [D,~] = size(x);
 const = -0.5 * D * log(2*pi);

 term1 = -0.5 * ((x - mu)' * (inv(Sigma) * (x - mu)));
 term2 = - 0.5 * logdet(Sigma);    
 loggaussian = const + term1 + term2;
end

function y = logdet(A)
 y = log(det(A));
end 

在某些情况下我会收到错误

Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
NaN

我知道你会指出我的数据不一致,但我需要实现该函数,以便我可以获得最佳近似值而不是抛出警告。 .如何确保始终获得价值。

【问题讨论】:

    标签: matlab gaussian


    【解决方案1】:

    我认为警告来自使用inv(Sigma)。根据documentation,你应该避免使用inv,它的使用可以被\mldivide)代替。这将为您提供更好的速度和准确性。

    对于您的代码,请使用 Sigma \ (x - mu),而不是 inv(Sigma) * (x - mu)

    【讨论】:

    • 也试过了,即使这样我也得到了完全相同的警告
    • 您的矩阵可能确实是badly conditioned。你能发布Sigma的值吗?
    • 是的,我的矩阵确实条件很差。现在我纠正了它并修复了错误,所以我不再有矩阵了。但我想要的是返回一些值的函数,比如填充全 0 或全 inf 或其他值,而不是抛出错误
    • 您可以自己计算rcond,如果它接近于零或NaN,则返回其他值
    【解决方案2】:

    以下方法应该(稍微)对协方差矩阵的病态不太敏感:

    function logpdf = logmvnpdf (x, mu, K)
    
    n = length (x);
    
    R = chol (K);
    
    const = 0.5 * n * log (2 * pi);
    term1 = 0.5 * sum (((R') \ (x  - mu)) .^ 2);
    term2 = sum (log (diag (R)));
    
    logpdf = - (const + term1 + term2);
    
    end
    

    如果K 是单数或接近单数,您在调用chol 时仍会收到警告(或错误)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 2015-08-18
      • 2021-01-18
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      相关资源
      最近更新 更多