我正在尝试在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
我知道你会指出我的数据不一致,但是我需要实现这个功能,以便我可以得到最好的近似而不是发出警告。 。我如何确保始终获得价值。
答案 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
时仍可能出现警告(或错误)。