En MATLAB, he escrito dos fragmentos de código que calcular el PDF de una distribución normal multivariante. Sin embargo, hay una diferencia en los valores de estos dos métodos producen y no puedo entender por qué. He reducido el problema a algo que tiene que ver con la computación de la inversa de la matriz de covarianza.
Inexacta código
function p = mvnpdf_inacc(X, mu, sigma)
xc = bsxfun(@minus, X, mu);
[n, k] = size(xc);
twopic = (2 * pi) ^ (-k / 2);
sqrtdetsig = sqrt(det(sigma)) ^ -1;
c = twopic * sqrtdetsig;
p = zeros(n, 1);
for i = 1:n
xci = xc(i, :);
p(i) = c * exp(-0.5 * (xci / sigma * xci'));
end
end
Precisa de código
function p = mvnpdf_acc(X, mu, sigma)
[R, err] = cholcov(sigma, 0);
if err
error('%s', 'sigma is not both symmetric and positive definite');
end
X0 = bsxfun(@minus, X, mu) / R;
d = min(size(X));
slogdet = sum(log(diag(R)));
p = exp(-0.5 * sum(X0 .^ 2, 2) - slogdet - 0.5 * d * log(2 * pi));
end
Código de prueba
function iseq_func = test_mvnpdf(n)
x = linspace(-2, 2, n);
y = x;
[X, Y] = meshgrid(x, y);
XY = [X(:), Y(:)];
mu = [0, 0];
sigma = [1.0, 0.5; 0.5, 0.4];
p_inacc = mvnpdf_inacc(XY, mu, sigma);
p_acc = mvnpdf_acc(XY, mu, sigma);
p_diff = abs(p_inacc - p_acc);
iseq_func = nnz(p_diff) == 0;
end
Puedo obtener un valor de false de ejecución iseq_func(25)
. ¿Qué diablos está pasando aquí? Gracias!