numpy.linalg.pinv#
- linalg.pinv(a, rcond=None, hermitian=False, *, rtol=<no value>)[source]#
计算矩阵的 (Moore-Penrose) 伪逆。
使用矩阵的奇异值分解 (SVD) 计算矩阵的广义逆,并包含所有大奇异值。
在版本 1.14 中变更: 现在可以对矩阵堆栈进行操作
- 参数:
- a(…, M, N) array_like
要进行伪逆的矩阵或矩阵堆栈。
- rcond(…) array_like of float, optional
小奇异值的截止值。小于或等于
rcond * largest_singular_value
的奇异值将被设置为零。针对矩阵堆栈进行广播。默认值:1e-15
。- hermitianbool, optional
如果为 True,则假定 a 为 Hermitian(如果为实值,则为对称),这将启用更有效的方法来查找奇异值。默认为 False。
版本 1.17.0 中的新增功能。
- rtol(…) array_like of float, optional
与 rcond 相同,但它是数组 API 兼容的参数名称。一次只能设置 rcond 或 rtol。如果没有提供任何参数,则使用 NumPy 的
1e-15
默认值。如果传递rtol=None
,则使用 API 标准默认值。版本 2.0.0 中的新增功能。
- 返回值:
- B(…, N, M) ndarray
a 的伪逆。如果 a 是
matrix
实例,则 B 也是如此。
- 引发:
- LinAlgError
如果 SVD 计算没有收敛。
参见
scipy.linalg.pinv
SciPy 中的类似函数。
scipy.linalg.pinvh
计算 Hermitian 矩阵的 (Moore-Penrose) 伪逆。
备注
矩阵 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, 线性代数及其应用,第 2 版,奥兰多,佛罗里达州,学术出版社,1980 年,第 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