鉴于m by n
矩阵X
高,我需要计算s = 1 + x(X.T X)^{-1} x.T
。这里,x
是行向量,s
是标量。有没有一种有效的(或推荐的)方法来在python中计算它?
毋庸置疑,X.T X
将是对称肯定的。
我的尝试:
如果我们考虑QR
的{{1}}分解,即X
,其中X = QR
是正交的,Q
是上三角形,那么{{1 }} = R
。
X.T X
可以轻松获得 R.T R
分解,即
QR
但话又说回来,是否有一种特别有效的方法来计算numpy.linalg.qr
?
答案 0 :(得分:1)
如果您要对QR
进行X
分解,从而得到X.T X = R.T R
,则可以通过使用forward和来避免使用np.linalg.inv
(和np.linalg.solve
)。而是使用scipy.linalg.solve_triangular
向后替换(R.T
是较低的三角形!):
import numpy as np
import scipy.linalg as LA
Q,R = np.linalg.qr(X)
# solve R.T R z = x such that R z = y
# with step (a) then (b)
# step (a) solve R.T y = x
y = LA.solve_triangular(R,x,trans='T')
# step (b) solve R z = y
z = LA.solve_triangular(R,x)
s = 1 + x @ z
其中@
是python3
矩阵乘法运算符。