numpy.linalg.pinv#
- linalg.pinv(a, rcond=None, hermitian=False, *, rtol=<no value>)[源代码]#
计算矩阵的(摩尔-彭罗斯)伪逆.
使用矩阵的奇异值分解(SVD)计算其广义逆,并包括所有*大*奇异值.
在 1.14 版本发生变更: 现在可以操作矩阵堆栈
- 参数:
- a(…, M, N) array_like
要被伪逆的矩阵或矩阵堆栈.
- rcond(…)类数组浮点数,可选
小奇异值的截断.小于或等于
rcond * largest_singular_value
的奇异值被设置为零.针对矩阵堆栈进行广播.默认值:1e-15
.- hermitianbool, 可选
如果为真,假设 a 是 Hermitian(如果实值则为对称),这样可以更有效地找到奇异值.默认为 False.
在 1.17.0 版本加入.
- rtol(…)类数组浮点数,可选
与 rcond 相同,但这是一个符合 Array API 的参数名称.一次只能设置 rcond 或 rtol.如果两者都没有提供,则使用 NumPy 的
1e-15
默认值.如果传递rtol=None
,则使用 API 标准默认值.在 2.0.0 版本加入.
- 返回:
- B(…, N, M) ndarray
a 的伪逆.如果 a 是一个 matrix 实例,那么 B 也是一个 matrix 实例.
- 引发:
- LinAlgError
如果SVD计算不收敛.
参见
scipy.linalg.pinv
SciPy 中的类似功能.
scipy.linalg.pinvh
计算厄米矩阵的(摩尔-彭罗斯)伪逆.
备注
矩阵 A 的伪逆,记作 \(A^+\),定义为:”解决[最小二乘问题] \(Ax = b\) 的矩阵”,即,如果 \(\bar{x}\) 是该解,那么 \(A^+\) 是使得 \(\bar{x} = A^+b\) 的矩阵.
可以证明,如果 \(Q_1 \Sigma Q_2^T = A\) 是 A 的奇异值分解,那么 \(A^+ = Q_2 \Sigma^+ Q_1^T\),其中 \(Q_{1,2}\) 是正交矩阵,:math:Sigma 是由 A 的所谓奇异值组成的对角矩阵(通常后面跟着零),而 \(\Sigma^+\) 则是由 A 的奇异值的倒数组成的对角矩阵(同样,后面跟着零). [1]
参考文献
[1]G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, pp. 139-142.
示例
以下示例检查
a * a+ * a == a
和a+ * a * a+ == a+
:>>> import numpy as np >>> rng = np.random.default_rng() >>> a = rng.normal(size=(9, 6)) >>> B = np.linalg.pinv(a) >>> np.allclose(a, np.dot(a, np.dot(B, a))) True >>> np.allclose(B, np.dot(B, np.dot(a, B))) True