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) не является положительно определенной, таким образом, вы не можете запустить Чолески разложение на нем. Существует много способов оценки ковариации в приятной манере, простое вычисление эмпирической оценки (что вы делаете по телефону cov) не работает, когда ваши данные вырождаются (он лежит в низкоразмерном многообразии). Один из самых простых решений является использование "вытягивается оценщик" формы:

cov(X) + eps * I 

вместо

cov(X) 

, таким образом, просто изменить

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

включить этот дополнительный + eps * I (где I является единичная матрица соответствующего размера).

+1

Извините! Не работает! – anonymous

+1

Да, это так, с достаточно большим количеством эпсилон, это решит проблему. – lejlot

Смежные вопросы