【问题标题】:efficient way to invert large correlation matrix反转大相关矩阵的有效方法
【发布时间】:2014-02-25 00:30:30
【问题描述】:

假设我有一个非常大的这种形式的相关矩阵:

t1.rep1 = rnorm(n=100,mean=10,sd=)
t2.rep1 = t1.rep1 + rnorm(n=100,mean=3,sd=2)
t3.rep1 = t1.rep1 + rnorm(n=100,mean=2,sd=2)
t1.rep2 = rnorm(n=100,mean=2,sd=1)
t2.rep2 = t1.rep2 + rnorm(n=100,mean=0.5,sd=0.5)
t3.rep2 = t1.rep2 + rnorm(n=100,mean=0.7,sd=0.9)
t1.rep3 = rnorm(n=100,mean=2,sd=1)
t2.rep3 = t1.rep3 + rnorm(n=100,mean=0.5,sd=0.5)
t3.rep3 = t1.rep3 + rnorm(n=100,mean=0.7,sd=0.9)
Sigma = matrix(
  c(cov(t1.rep1, t1.rep1), 0, 0, cov(t1.rep1, t2.rep1), 0, 0, cov(t1.rep1, t3.rep1), 0, 0,
  0, cov(t1.rep2, t1.rep2), 0, 0, cov(t1.rep2, t2.rep2), 0, 0, cov(t1.rep2, t3.rep2), 0,
  0, 0, cov(t1.rep3, t1.rep3), 0, 0, cov(t1.rep3, t2.rep3), 0, 0, cov(t1.rep3, t3.rep3),
  cov(t2.rep1, t1.rep1), 0, 0, cov(t2.rep1, t2.rep1), 0, 0, cov(t2.rep1, t3.rep1), 0, 0,
  0, cov(t2.rep2, t1.rep2), 0, 0, cov(t2.rep2, t2.rep2), 0, 0, cov(t2.rep2, t3.rep2), 0,
  0, 0, cov(t2.rep3, t1.rep3), 0, 0, cov(t2.rep3, t2.rep3), 0, 0, cov(t2.rep3, t3.rep3),
  cov(t3.rep1, t1.rep1), 0, 0, cov(t3.rep1, t2.rep1), 0, 0, cov(t3.rep1, t3.rep1), 0, 0,
  0, cov(t3.rep2, t1.rep2), 0, 0, cov(t3.rep2, t2.rep2), 0, 0, cov(t3.rep2, t3.rep2), 0,
  0, 0, cov(t3.rep3, t1.rep3), 0, 0, cov(t3.rep3, t2.rep3), 0, 0, cov(t3.rep3, t3.rep3)),
  nrow = 9, ncol = 9)

我的相关矩阵是 Sigma。

我想计算它的倒数,即

Sigma.inv = solve(Sigma)

实际上,我的 sigma 要大得多,取其倒数需要很长时间。

是否可以使用矩阵的稀疏性和结构以更快/更有效的方式计算 Sigma 的逆?

我需要迭代地计算这个逆,因此计算逆的快速方法将大大提高我的算法速度。

【问题讨论】:

    标签: r covariance inverse


    【解决方案1】:

    您提供的Sigma 实际上是块对角线:

    x = c(1,4,7,2,5,8,3,6,9)
    Sigma[x,x]
    
              [,1]     [,2]      [,3]     [,4]     [,5]     [,6] ...
    [1,] 0.9494388 1.130673 0.9825316 0.000000 0.000000 0.000000 ...
    [2,] 1.1306727 4.983144 1.2112634 0.000000 0.000000 0.000000 ...
    [3,] 0.9825316 1.211263 5.0771423 0.000000 0.000000 0.000000 ...
    [4,] 0.0000000 0.000000 0.0000000 1.211892 1.223293 1.328587 ...
    [5,] 0.0000000 0.000000 0.0000000 1.223293 1.469146 1.242400 ...
    [6,] 0.0000000 0.000000 0.0000000 1.328587 1.242400 2.377406 ...
    ...
    

    并且块对角矩阵可以更快地进行块反转。只需将每个块替换为其倒数即可。

    【讨论】:

    • @Shabalin,非常感谢,看起来是个不错的建议。在 R 中快速执行每个块的逆运算的任何技巧?只需对每个块执行应用功能吗?或者做一个for循环?在 R 中,for 循环往往很慢...
    • 也许您可以将矩阵存储在块中。
    • @Shabalin 非常感谢,所有指向正确方向的指针。但是,逐块反转仍然很慢。我试过cholesky,它不是很好。有没有办法进一步加快矩阵的求逆速度,多线程是个好方法吗?我将把它作为一个单独的问题发布。
    猜你喜欢
    • 2012-12-30
    • 2021-06-23
    • 2012-11-11
    • 2016-06-07
    • 2017-02-12
    • 2016-06-15
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    相关资源
    最近更新 更多