R 为什么cholesky分解不能给出与简单求逆矩阵相同的结果? 设置以重现我的最小工作示例
我有下面的矩阵R 为什么cholesky分解不能给出与简单求逆矩阵相同的结果? 设置以重现我的最小工作示例,r,matrix,optimization,linear-algebra,matrix-inverse,R,Matrix,Optimization,Linear Algebra,Matrix Inverse,我有下面的矩阵 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,
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)
Cholesky分解-失败
然而,“聪明”的方法失败了。我使用cholesky分解,它给了我一个上三角矩阵。然后我通过向后代换求解系统lz=y
,通过向前代换求解系统lt x=L^{-1}y
L <- chol(K) ## upper triangular
forwardsolve(t(L), backsolve(L, y))
发生了什么事?这个矩阵
K
和这个向量'y'只是一个例子。它发生在许多其他类似的向量和矩阵上。为什么?这只是部分答案,但总比什么都没有好。基本上,找到K^{-1}y相当于求解以下系统
用cholesky分解来写这个
基本上我们现在把<代码> Lz <代码>作为我们的变量,称之为代码> x< /代码>
forwardsolve(t(L), y)
由于L
是上三角形,它的转置是下三角形,所以我们可以使用forwardsolve
来查找x
forwardsolve(t(L), y)
一旦我们找到了x
,我们就可以记住它的意思,即
这样我们就可以使用'backsolve来查找
z`
backsolve(L, forwardsolve(t(L), y))
这就给出了正确的答案。不确定为什么相反的方法也不起作用。关键是,当取一个乘积的倒数时,必须将倒数的乘积倒数:
solve(A %*% B) = solve(B) %*% solve(A)
在这个问题上,顺序没有颠倒
如果R=chol(K)
我们使用R
强调它是右上三角形,那么:
solve(K, y)
= solve(t(R) %*% R, y) since K = t(R) %*% R
= solve(t(R) %*% R) %*% y
= solve(R) %*% solve(t(R)) %*% y note that we have reversed the order
= solve(R) %*% solve(t(R), y)
= backsolve(R, forwardsolve(t(R), y))
在最后一行中,我们使用了一个事实,即R的转置是左下三角形,forwardsolve
适用于此类矩阵,而backsolve
适用于右上三角形矩阵
我们可以检查这是否给出了与使用solve
direclty相同的答案:
R = chol(K)
all.equal(backsolve(R, forwardsolve(t(R), y)), solve(K, y))
# [1] TRUE
也许
chol2inv(chol(K))%*%y
?@Matt难以置信,这给出了一个与两者不同的答案<代码>[,1][1,]39.138913[2,]-14.385526[3,]-5.993738[4,]27.188652[5,]6.766934@Matt我想有人也有类似的问题,但没有人真正能够回答chol2inv(chol(K))%*%y
给我的结果是solve(K)%*%y
。看@Matt,没错,同样的结果!您知道chol2inv是否应该优先于使用forwardsolve和backsolve解决系统问题吗?
solve(A %*% B) = solve(B) %*% solve(A)
solve(K, y)
= solve(t(R) %*% R, y) since K = t(R) %*% R
= solve(t(R) %*% R) %*% y
= solve(R) %*% solve(t(R)) %*% y note that we have reversed the order
= solve(R) %*% solve(t(R), y)
= backsolve(R, forwardsolve(t(R), y))
R = chol(K)
all.equal(backsolve(R, forwardsolve(t(R), y)), solve(K, y))
# [1] TRUE