2016-11-05 28 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

相關問題