我想使用 scipy.linalg.solve_triangle() 来求解 xA=b (而不是 Ax=b)形式的系统。是否有捷径可寻?我认为我可以在使用该函数之前转置所有内容,但似乎不起作用。感谢任何帮助,我是该领域的初学者!
向量x必须是(1 x n);矩阵 A 必须是 (n x m);向量 b 必须是 (1 x m)。
如果对两边进行转置,你会得到:
(xA)^T = b^T
重新排列 LHS:
(A^T)(x^T) = b^T
现在 A^T 是一个 (m x n) 矩阵; x 是 (n x 1) 向量; b 是 (m x 1) 向量。
如果 A 是正方形且对称,则根据定义 A^T = A。不需要做任何工作。
您可以使用常用技术解决
x^T = (A^T)^-1 (b^T)
。
我不建议计算矩阵逆。如果您的矩阵是方阵,则最好使用 LU 分解和前后替换。更稳定了。
为什么要使用
solve_triangular
?您的意思是简单的最小二乘问题吗? - 那么你无论如何都会成为三角形的上矩阵和下矩阵:
import numpy as np
from scipy.linalg import solve_triangular
from scipy.linalg import solve
from scipy.linalg import lstsq, lu
np.random.seed(0)
x = np.random.randint(0, 100, 100) # sample dataset for independent variables
y = np.random.randint(0, 100, 100) # sample dataset for dependent variables
X = np.column_stack((np.ones(len(y)), x)) # for intercept
p,l,u= lu(X.T@X) # LU-factorization
theta= solve_triangular(u, solve_triangular(l, p.T@(X.T@y), lower= True, overwrite_b=False, check_finite=True))
print(theta)
theta= solve(X.T@X, X.T@y)
print(theta)
thetaLS= lstsq(X,y.T)[0]
print(thetaLS)
# intercept, beta
# [ 4.93699392e+01 -6.21893497e-03]
# [ 4.93699392e+01 -6.21893497e-03]
# [ 4.93699392e+01 -6.21893497e-03]
或者您选择
solve_triangular
执行什么任务的原因是什么?