如何在matlab中计算多元高斯的对数

时间:2014-04-15 01:05:21

标签: matlab gaussian

我正在尝试在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

我知道你会指出我的数据不一致,但是我需要实现这个功能,以便我可以得到最好的近似而不是发出警告。 。我如何确保始终获得价值。

2 个答案:

答案 0 :(得分:1)

我认为警告来自使用inv(Sigma)。根据{{​​3}},您应该避免使用inv\documentation)可以替换其使用。这将为您提供更好的速度和准确性。

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

答案 1 :(得分:0)

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

order by

如果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时仍可能出现警告(或错误)。