2016-11-05 26 views
0

如何解决此错误?错误:chol:输入矩阵必须为正确的

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 
>> 

回答

2

的错误是相当自我解释

input matrix must be positive definite

意味着你的矩阵(sigma)是不是正定的,所以你不能在它上面运行Cholesky分解。有很多方法可以很好地估计协方差,只要计算经验估计值(通过调用cov所做的操作)在数据退化时(它位于低维流形中)不起作用。一个简单的解决方法是使用形式的 “拉估计”:

cov(X) + eps * I 

,而不是

cov(X) 

从而也就改变

sigma = cov(train(clidx,2:end)); 

将这一额外+ eps * I(其中I是适当维度的单位矩阵)。

+1

对不起!不工作! – anonymous

+1

是的,它具有足够大的epsilon它将解决问题。 – lejlot

相关问题