【问题标题】:MatLab : chol Matrix must be positive definiteMatLab:chol矩阵必须是正定的
【发布时间】:2018-02-18 07:31:27
【问题描述】:

我正在尝试将 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(绑定);
copulafit 中的错误(第 126 行)
[lowerBnd,upperBnd] = 括号1D(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 

【问题讨论】:

    标签: matlab matrix-inverse decomposition


    【解决方案1】:

    实际上,您的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,range2); % 1
    

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

    您唯一的解决方案是:

    1. 更改变量
    2. 向变量添加随机噪声(如果允许)

    让我们用第二个选项做一个例子:

    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');
    

    这将正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 2017-03-19
      • 1970-01-01
      • 2019-08-30
      • 2016-11-05
      • 2013-04-02
      • 2018-08-05
      • 2019-06-07
      相关资源
      最近更新 更多