【问题标题】:MvNormal Error with Symmetric & Positive Semi-Definite Matrix具有对称和正半定矩阵的 MvNormal 误差
【发布时间】:2016-02-25 06:07:49
【问题描述】:

我的问题总结是我正在尝试复制Matlab函数:

mvnrnd(mu', sigma, 200)

进入 Julia 使用:

rand( MvNormal(mu, sigma), 200)'

结果是一个 200 x 7 的矩阵,本质上是生成 200 个随机返回的时间序列数据。

Matlab 有效,而 Julia 无效。

我的输入矩阵是:

mu = [0.15; 0.03; 0.06; 0.04; 0.1; 0.02; 0.12]

sigma = [0.0035   -0.0038   0.0020    0.0017    -0.0006   -0.0028  0.0009;
    -0.0038    0.0046   -0.0011    0.0001    0.0003    0.0054   -0.0024;
    0.0020   -0.0011    0.0041    0.0068   -0.0004    0.0047   -0.0036;
    0.0017    0.0001    0.0068    0.0125    0.0002    0.0109   -0.0078;
    -0.0006    0.0003   -0.0004    0.0002    0.0025   -0.0004   -0.0007;
    -0.0028    0.0054    0.0047    0.0109   -0.0004    0.0159   -0.0093;
    0.0009   -0.0024   -0.0036   -0.0078   -0.0007   -0.0093    0.0061]

使用 Distributions.jl,运行该行:

MvNormal(sigma)

产生错误:

ERROR: LoadError: Base.LinAlg.PosDefException(4)

矩阵sigma是对称的,但只是半正定的:

issym(sigma) #symmetrical
> true
isposdef(sigma) #positive definite
> false

using LinearOperators
check_positive_definite(sigma) #check for positive (semi-)definite
> true

Matlab 对这些测试产生相同的结果,但 Matlab 能够生成 200x7 随机返回样本矩阵。

有人可以建议我可以做些什么来让它在 Julia 中工作吗?或者问题出在哪里?

谢谢。

【问题讨论】:

    标签: matlab linear-algebra julia matrix-decomposition


    【解决方案1】:

    问题在于协方差矩阵是不确定的。见

    julia> eigvals(sigma)
    7-element Array{Float64,1}:
     -3.52259e-5
     -2.42008e-5
      2.35508e-7
      7.08269e-5
      0.00290538
      0.0118957 
      0.0343873 
    

    所以它不是协方差矩阵。这可能是由于舍入而发生的,因此如果您可以访问未舍入的数据,则可以尝试这样做。我刚刚尝试过,我在 Matlab 中也遇到了错误。然而,与 Julia 相比,Matlab 确实允许矩阵是正定的。

    实现这项工作的一种方法是将对角矩阵添加到原始矩阵,然后将其输入到MvNormal。即

    julia> MvNormal(randn(7), sigma - minimum(eigvals(Symmetric(sigma)))*I)
    Distributions.MvNormal{PDMats.PDMat{Float64,Array{Float64,2}},Array{Float64,1}}(
    dim: 7
    μ: [0.889004,-0.768551,1.78569,0.130445,0.589029,0.529418,-0.258474]
    Σ: 7x7 Array{Float64,2}:
      0.00353523  -0.0038       0.002        0.0017     -0.0006      -0.0028      0.0009    
     -0.0038       0.00463523  -0.0011       0.0001      0.0003       0.0054     -0.0024    
      0.002       -0.0011       0.00413523   0.0068     -0.0004       0.0047     -0.0036    
      0.0017       0.0001       0.0068       0.0125352   0.0002       0.0109     -0.0078    
     -0.0006       0.0003      -0.0004       0.0002      0.00253523  -0.0004     -0.0007    
     -0.0028       0.0054       0.0047       0.0109     -0.0004       0.0159352  -0.0093    
      0.0009      -0.0024      -0.0036      -0.0078     -0.0007      -0.0093      0.00613523
    )
    

    “协方差”矩阵当然不一样了,但是已经很接近了。

    【讨论】:

    • 如果sigma 恰好是半正定的,则​​不需要更改。因此,“固定”sigma 可以表示为 sigma+max(0,-minimum(eigvals(sigma)))*I
    • @AndreasNoack 感谢您的详细解释和回答,这正是我想要的。
    • @user3580870 我的协方差矩阵 sigma 是从用户输入的数据生成的,并且始终是正定或半正定,因此恰好是一个非常有效的解决方案。谢谢!
    猜你喜欢
    • 2013-03-08
    • 2015-07-12
    • 2017-04-03
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多