MatLab:chol Matrix必须是肯定的

时间:2017-09-09 15:38:27

标签: matlab matrix-inverse decomposition

我正在尝试将MatLab中的t copula与我的数据相匹配,我的功能是:

u = ksdensity(range_1,  range_1,'function','cdf');
v = ksdensity(range_2,  range_2,'function','cdf');
%fit a t-copula to returns
rng default ; % For reproducibility
[Rho,nu] = copulafit('t',[u v],'Method','ApproximateML');

我收到一条错误消息:

  

使用chol时出错       矩阵必须是正定的       copulafit / approxProfileNLL_t中的错误(第314行)
      nll = negloglike_t(nu,chol(Rho),t_);
      copulafit中的错误> bracket1D(第494行)
      oldnll = nllFun(bound);
      copulafit错误(第126行)
      [lowerBnd,upperBnd] = bracket1D(profileFun,lowerBnd,5); %' upper',从5开始搜索

我知道它是由于chol()分解而发生的,但我不知道应该更改哪些参数来克服这个问题。任何帮助将不胜感激。

我使用的数据看起来像是:

 range_1         range_2
-0.639388612    -0.639388612
1.029603565     1.029603565
1.273883288     1.273883288
0.754717135     0.754717135
1.747817835     1.747817835
1.717787291     1.717787291
-0.120625114    -0.120625114
2.173913469     2.173913469
2.836879977     2.836879977
-0.804601995    -0.804601995
       0         0 

1 个答案:

答案 0 :(得分:0)

实际上,您的range1range2变量完全相同。在命令窗口中进行简单检查即可确认:

eq = (range1 == range2)

eq =

  11×1 logical array

   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1

由于copulafit函数的目标是计算高斯Copula的线性相关参数矩阵的估计值,因此整个过程失败,输入变量过于相关:

c = corr(range1,range1); % 1

实际上,我们在range1range2之间正面临着完美的正相关关系。抛出异常chol(引用here)的函数只是生成高斯Copula拟合的过程的一部分,它由copulafit函数内部调用

您拥有的唯一解决方案是:

  1. 更改变量
  2. 向您的变量添加随机噪音(如果您被允许)
  3. 让我们使用第二个选项做个例子:

    range1 = [
        -0.639388612
        1.029603565
        1.273883288
        0.754717135
        1.747817835
        1.717787291
        -0.120625114
        2.173913469
        2.836879977
        -0.804601995
        0
    ];
    
    % just an example, I'm tired of using rand function xD
    range2 = awgn(range1,1,'measured');
    
    u = ksdensity(range1,  range1,'function','cdf');
    v = ksdensity(range2,  range2,'function','cdf');
    rng default ;
    [Rho,nu] = copulafit('t',[u v],'Method','ApproximateML');
    

    这样可以正常运行。