错误:chol:输入矩阵必须是正定的

时间:2016-11-05 13:47:57

标签: matlab machine-learning pattern-matching octave naivebayes

如何解决此错误?

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

1 个答案:

答案 0 :(得分:2)

错误非常自我解释

  

输入矩阵必须是正定的

意味着你的矩阵(sigma)不是正定的,因此你不能对它进行cholesky分解。有许多方法可以很好地估计协方差,简单地计算经验估计(通过调用cov所做的事情)在数据退化时不起作用(它位于低维流形中)。最简单的解决方案之一是使用“pull estimator”形式:

cov(X) + eps * I

而不是

cov(X)

因此只需改变

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

合并此额外+ eps * I(其中I是适当维度的单位矩阵)。