如何解决此错误?
mvnpdf.m
% y = mvnpdf(x,mu,Sigma)
% Compute multivariate normal pdf for x given mean mu and covariance matrix
% sigma. The dimension of x is d x p, mu is 1 x p and sigma is p x p.
function pdf = mvnpdf(x,mu,sigma)
[d,p] = size(x);
% mu can be a scalar, a 1xp vector or a nxp matrix
if nargin == 1, mu = 0; end
if all(size(mu) == [1,p]), mu = repmat(mu,[d,1]); end
if nargin < 3
pdf = (2*pi)^(-p/2) * exp(-sumsq(x-mu,2)/2);
else
r = chol(sigma);
pdf = (2*pi)^(-p/2) * exp(-sumsq((x-mu)/r,2)/2) / prod(diag(r));
end
pdfdep.m
function pdfmx = pdfdep(train, test)
% computes probability density for all classes
% assuming feature independence
% train - train set; the first column contains label
% used to compute mean and variation for all classes
% test - test set (without labels)
% pdfmx - matrix of probability density for all classes
% class with label idx is stored in pdfmx(:,idx)
classnb = rows(unique(train(:,1)));
pdfmx = ones(rows(test), classnb);
for cl=1:classnb
clidx = train(:,1) == cl;
mu = mean(train(clidx,2:end));
sigma = cov(train(clidx,2:end));
pdfmx(:,cl) = mvnpdf(test, mu, sigma);
end
mat.txt
1 2 3 4 5 6 7 8
2 3 4 5 6 7 8 1
3 4 5 6 7 8 1 2
4 5 6 7 8 1 2 3
1 8 7 6 5 4 3 2
2 7 6 5 4 3 2 9
3 6 5 4 3 2 9 8
4 5 4 3 2 9 8 7
1 8 7 6 5 4 3 2
3 6 5 4 3 2 9 8
错误讯息:
>> mat2 = mat;
>> pdfdep(mat, mat2)
error: chol: input matrix must be positive definite
error: called from
mvnpdf at line 13 column 7
pdfdep at line 20 column 15
>>
答案 0 :(得分:2)
错误非常自我解释
输入矩阵必须是正定的
意味着你的矩阵(sigma
)不是正定的,因此你不能对它进行cholesky分解。有许多方法可以很好地估计协方差,简单地计算经验估计(通过调用cov
所做的事情)在数据退化时不起作用(它位于低维流形中)。最简单的解决方案之一是使用“pull estimator”形式:
cov(X) + eps * I
而不是
cov(X)
因此只需改变
sigma = cov(train(clidx,2:end));
合并此额外+ eps * I
(其中I
是适当维度的单位矩阵)。