如何在不进行矩阵求逆的情况下有效地计算 diag(X %*% solve(A) %*% t(X))?
How to compute diag(X %*% solve(A) %*% t(X)) efficiently without taking matrix inverse?
我需要以下对角线:
diag(X %*% solve(A) %*% t(X))
其中A
是满秩方阵,X
是矩形矩阵。 A
和 X
都是稀疏的。
我知道求逆矩阵很糟糕,除非你真的需要它。但是,我看不出如何重写公式,将 solve(A)
替换为具有两个参数的 solve
,这样就可以在不显式反转的情况下求解线性系统。这可能吗?
也许在我真正开始之前,我需要提一下,如果你这样做的话
diag(X %*% solve(A, t(X)))
避免矩阵求逆。 solve(A, B)
执行 LU 分解并使用生成的三角矩阵因子求解线性方程组 A x = B
。如果您未指定 B
,它默认为对角矩阵,因此您将显式计算 A
.
的矩阵逆矩阵
您应该仔细阅读 ?solve
,并可能多次阅读以获取提示。它说它基于LAPACK
例程DGESV
,在那里你可以找到幕后的数值线性代数。
DGESV computes the solution to a real system of linear equations
A * X = B,
where A is an N-by-N matrix and X and B are N-by-N RHS matrices.
The LU decomposition with partial pivoting and row interchanges is
used to factor A as
A = P * L * U,
where P is a permutation matrix, L is unit lower triangular, and U is
upper triangular. The factored form of A is then used to solve the
system of equations A * X = B.
solve(A, t(X))
和 solve(A) %*% t(X)
之间的区别是效率问题。后者的一般矩阵乘法%*%
比solve
本身要贵很多
然而,即使您使用 solve(A, t(X))
,您也不是在最快的轨道上,因为您还有另一个 %*%
。
此外,由于您只需要对角线元素,因此在第一次获取完整矩阵时会浪费大量时间。 我下面的回答会让你走上最快的轨道。
我用 LaTeX 重写了所有内容,内容也大大扩展了,包括对 R 实现的引用。最后提供了有关 QR 分解、奇异值分解和 Pivoted Cholesky 分解的额外资源,以防您发现它们有用。
额外资源
如果您对枢轴 Cholesky 分解感兴趣,可以参考 Compute projection / hat matrix via QR factorization, SVD (and Cholesky factorization?)。在那里我还讨论了 QR 分解和奇异值分解。
以上link设置在普通最小二乘回归上下文中。加权最小二乘可以参考Get hat matrix from QR decomposition for weighted least square regression.
QR 分解也采用紧凑形式。如果您想了解更多关于 QR 分解如何完成和存储的信息,您可以参考 。
这些问题和答案都集中在数值矩阵计算上。下面给出一些统计应用:
- Boosting
lm()
by a factor of 3, using Cholesky method rather than QR method
我需要以下对角线:
diag(X %*% solve(A) %*% t(X))
其中A
是满秩方阵,X
是矩形矩阵。 A
和 X
都是稀疏的。
我知道求逆矩阵很糟糕,除非你真的需要它。但是,我看不出如何重写公式,将 solve(A)
替换为具有两个参数的 solve
,这样就可以在不显式反转的情况下求解线性系统。这可能吗?
也许在我真正开始之前,我需要提一下,如果你这样做的话
diag(X %*% solve(A, t(X)))
避免矩阵求逆。 solve(A, B)
执行 LU 分解并使用生成的三角矩阵因子求解线性方程组 A x = B
。如果您未指定 B
,它默认为对角矩阵,因此您将显式计算 A
.
您应该仔细阅读 ?solve
,并可能多次阅读以获取提示。它说它基于LAPACK
例程DGESV
,在那里你可以找到幕后的数值线性代数。
DGESV computes the solution to a real system of linear equations
A * X = B,
where A is an N-by-N matrix and X and B are N-by-N RHS matrices.
The LU decomposition with partial pivoting and row interchanges is
used to factor A as
A = P * L * U,
where P is a permutation matrix, L is unit lower triangular, and U is
upper triangular. The factored form of A is then used to solve the
system of equations A * X = B.
solve(A, t(X))
和 solve(A) %*% t(X)
之间的区别是效率问题。后者的一般矩阵乘法%*%
比solve
本身要贵很多
然而,即使您使用 solve(A, t(X))
,您也不是在最快的轨道上,因为您还有另一个 %*%
。
此外,由于您只需要对角线元素,因此在第一次获取完整矩阵时会浪费大量时间。 我下面的回答会让你走上最快的轨道。
我用 LaTeX 重写了所有内容,内容也大大扩展了,包括对 R 实现的引用。最后提供了有关 QR 分解、奇异值分解和 Pivoted Cholesky 分解的额外资源,以防您发现它们有用。
额外资源
如果您对枢轴 Cholesky 分解感兴趣,可以参考 Compute projection / hat matrix via QR factorization, SVD (and Cholesky factorization?)。在那里我还讨论了 QR 分解和奇异值分解。
以上link设置在普通最小二乘回归上下文中。加权最小二乘可以参考Get hat matrix from QR decomposition for weighted least square regression.
QR 分解也采用紧凑形式。如果您想了解更多关于 QR 分解如何完成和存储的信息,您可以参考
这些问题和答案都集中在数值矩阵计算上。下面给出一些统计应用:
- Boosting
lm()
by a factor of 3, using Cholesky method rather than QR method