首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MatLab : chol矩阵必须是正定的

MatLab : chol矩阵必须是正定的
EN

Stack Overflow用户
提问于 2017-09-09 15:38:27
回答 1查看 1.7K关注 0票数 4

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

代码语言:javascript
运行
复制
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行) nllFun(束缚); copulafit中的错误(第126行) lowerBnd,upperBnd = bracket1D(profileFun,lowerBnd,5);%‘from’,从5向上搜索

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

我使用的数据如下:

代码语言:javascript
运行
复制
 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 
EN

回答 1

Stack Overflow用户

发布于 2017-11-30 20:41:03

实际上,您的range1range2变量是完全相同的。命令窗口中的简单检查确认了这一点:

代码语言:javascript
运行
复制
eq = (range1 == range2)

eq =

  11×1 logical array

   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1

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

代码语言:javascript
运行
复制
c = corr(range1,range2); % 1

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

你唯一的解决办法是:

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

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

代码语言:javascript
运行
复制
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');

这样做是没有错误的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46132290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档