【问题标题】:Error: chol: input matrix must be positive definite错误:chol:输入矩阵必须是正定的
【发布时间】:2017-03-19 05:59:35
【问题描述】:

我该如何解决这个错误?

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

ma​​t.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
>>

【问题讨论】:

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


    【解决方案1】:

    这个错误很容易解释

    输入矩阵必须是正定的

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

    cov(X) + eps * I
    

    而不是

    cov(X)
    

    所以改变

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

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

    【讨论】:

    • 是的,有了足够大的 epsilon 就可以解决问题。
    猜你喜欢
    • 2022-10-21
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多