![](/img/trans.png)
[英]Why is inverting a positive definite matrix via Cholesky decomposition slower than regular inversion with numpy?
[英]Why is cholesky decomposition not giving me the same result as simply inverting the matrix?
我有以下矩陣
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' 只是一個例子。 它發生在許多其他類似的向量和矩陣中。 為什么?
關鍵在於,在取乘積的倒數時,必須反轉倒數的乘積:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.