为什么cholesky分解不给我与简单地将矩阵求逆相同的结果?

问题描述 投票:2回答:2

设置为复制我的最小工作示例

我有以下矩阵

K <- matrix(c(1.250000e+00, 3.366892e-07, 4.641930e-10, 1.455736e-08, 1.049863e-06, 
              3.366892e-07, 1.250000e+00, 5.482775e-01, 8.606555e-01, 9.776887e-01,
              4.641930e-10, 5.482775e-01, 1.250000e+00, 8.603413e-01, 4.246732e-01,
              1.455736e-08, 8.606555e-01, 8.603413e-01, 1.250000e+00, 7.490100e-01,
              1.049863e-06, 9.776887e-01, 4.246732e-01, 7.490100e-01, 1.250000e+00), nrow=5)

和以下向量

y <- matrix(c(39.13892, 12.34428, 12.38426, 14.71951, 10.52160), nrow=5)

问题

我想计算K的倒数与向量y的乘积。

幼稚的方法-有效

幼稚的方法有效(我有一种检查方法,但是在这里没关系)

solve(K) %*% y
           [,1]
[1,] 31.3111308
[2,]  3.0620869
[3,]  3.7383357
[4,]  6.6257060
[5,]  0.7820081

胆汁分解-失败

但是“聪明”方法失败。我使用cholesky分解,这给了我一个上三角矩阵。然后,我通过后向替换解决系统L z = y,并通过前向替换解决系统L^T x = L^{-1} y

L <- chol(K)  ## upper triangular
forwardsolve(t(L), backsolve(L, y))
          [,1]
[1,]  31.31112
[2,] -14.16259
[3,]   9.84534
[4,]  39.67900
[5,]  33.54842

发生了什么事?该矩阵K和向量“ y”仅是示例。它与许多其他类似的向量和矩阵一起发生。为什么?

r matrix optimization linear-algebra matrix-inverse
2个回答
1
投票

这只是部分答案,但总比没有好。基本上找到K ^ {-1} y等同于求解以下系统]

system

使用我们拥有的cholesky分解来编写

cholesky

基本上我们现在首先将Lz视为我们的变量,将其称为x

substitution

并且由于L是上三角的,所以它的转置是下三角的,所以我们可以使用forwardsolve查找x

forwardsolve(t(L), y)

一旦找到x,我们就只能记住它的含义,即

finalsystem

以便我们可以使用'backsolveto findz`

backsolve(L, forwardsolve(t(L), y))

这给出了正确的答案。不知道为什么其他方法不能正常工作。


0
投票

关键点是,当求积的逆时,必须对逆的积求逆:

solve(A %*% B) = solve(B) %*% solve(A)

问题中,顺序没有被颠倒。

如果为R = chol(K),请逐步进行:

solve(t(R) %*% R, y)
= solve(t(R) %*% R) %*% y
= solve(R) %*% solve(t(R)) %*% y
= solve(R) %*% solve(t(R), y)
= backsolve(R, forwardsolve(t(R), y))

我们可以检查一下是否确实与使用solve直接给出的答案相同]

all.equal(backsolve(R, forwardsolve(t(R), y)), solve(K, y))
# [1] TRUE
© www.soinside.com 2019 - 2024. All rights reserved.