Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么cholesky分解不能给出与简单求逆矩阵相同的结果? 设置以重现我的最小工作示例_R_Matrix_Optimization_Linear Algebra_Matrix Inverse - Fatal编程技术网

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