使用 scipy.linalg.solve_triangle 求解 xA=b

问题描述 投票:0回答:2

我想使用 scipy.linalg.solve_triangle() 来求解 xA=b (而不是 Ax=b)形式的系统。是否有捷径可寻?我认为我可以在使用该函数之前转置所有内容,但似乎不起作用。感谢任何帮助,我是该领域的初学者!

python scipy linear-algebra
2个回答
3
投票

向量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 分解和前后替换。更稳定了。


0
投票

为什么要使用

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
执行什么任务的原因是什么?

© www.soinside.com 2019 - 2024. All rights reserved.