针对np.linalg.pinv,是否存在类似np.linalg.solve的等价求解函数?
伪逆对应的类solve函数问题解答
对于线性方程组A @ x = b,我们知道有两种常见求解方式:
- 显式计算逆矩阵再作用于
b:x = np.linalg.inv(A) @ b - 使用专用求解函数:
x = np.linalg.solve(A, b)
后者因性能更优、数值稳定性更强,通常是优先选择的方案。针对伪逆的场景,其实不需要单独的psolve函数,np.linalg.lstsq(A, b, rcond=None)就完全等价于np.linalg.pinv(A) @ b,而且它的表现同样比直接计算伪逆再乘b更好。
np.linalg.lstsq本质是求解最小二乘问题,寻找能使||A@x - b||_2(欧几里得范数)最小的x:
- 当
A是方阵且可逆时,它的结果和solve完全一致; - 当
A不可逆或为非方阵时,它返回的解就是伪逆乘以b的结果,而且在解不唯一的情况下,会自动选择范数最小的那个解,这完全符合伪逆的定义。
举个实际代码例子验证:
import numpy as np # 构造一个非方阵的A和向量b A = np.array([[1, 2], [3, 4], [5, 6]]) b = np.array([7, 8, 9]) # 两种方式计算 x_pinv = np.linalg.pinv(A) @ b x_lstsq = np.linalg.lstsq(A, b, rcond=None)[0] # 验证结果一致 print(np.allclose(x_pinv, x_lstsq)) # 输出 True
所以实际开发中,优先使用np.linalg.lstsq来替代pinv(A) @ b,就像用solve替代inv(A) @ b的思路一样。
内容的提问来源于stack exchange,提问作者Till Hoffmann
相关产品推荐
相关产品推荐

