numpy.linalg.pinv#

linalg.pinv(a, rcond=None, hermitian=False, *, rtol=<no value>)[源代码]#

计算矩阵的(摩尔-彭罗斯)伪逆。

使用奇异值分解 (SVD) 计算矩阵的广义逆,并包含所有“大”奇异值。

参数:
a(…, M, N) 数组类型

要计算伪逆的矩阵或矩阵堆栈。

rcond(…) 浮点数组类型,可选

小奇异值的截止值。小于或等于 rcond * largest_singular_value 的奇异值将被设置为零。此值会广播到矩阵堆栈。默认值: 1e-15

hermitian布尔值,可选

如果为 True,则假定 a 是厄米矩阵(如果为实值,则为对称矩阵),从而可以使用更高效的方法查找奇异值。默认为 False。

rtol(…) 浮点数组类型,可选

rcond 相同,但它是 Array API 兼容的参数名。一次只能设置 rcondrtol 中的一个。如果两者都未提供,则使用 NumPy 的 1e-15 默认值。如果传入 rtol=None,则使用 API 标准默认值。

2.0.0 版本新增。

返回值:
B(…, N, M) ndarray

a 的伪逆。如果 amatrix 实例,则 B 也是。

引发:
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}\) 是正交矩阵,\(\Sigma\) 是一个由 A 的所谓奇异值组成的对角矩阵(通常后面跟着零),而 \(\Sigma^+\) 只是一个由 A 的奇异值的倒数组成的对角矩阵(同样后面跟着零)。 [1]

参考文献

[1]

G. Strang, Linear Algebra and Its Applications, 第2版,佛罗里达州奥兰多,Academic Press, Inc.,1980年,第139-142页。

示例

以下示例检查 a * a+ * a == aa+ * 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