pinv#
- scipy.linalg.pinv(a, *, atol=None, rtol=None, return_rank=False, check_finite=True)[源]#
计算矩阵的(Moore-Penrose)伪逆。
使用矩阵的奇异值分解
U @ S @ V
在经济模式下计算矩阵的广义逆,并仅选择与重要奇异值相关的列/行。如果
s
是a
的最大奇异值,则重要性截止值由atol + rtol * s
确定。任何低于此值的奇异值都被认为是不重要的。本文档假定数组参数具有指定的“核心”形状。但是,此函数的数组参数可能在核心形状前添加了额外的“批处理”维度。在这种情况下,数组被视为低维切片的批次;详见批处理线性操作。
- 参数:
- a(M, N) array_like
待求伪逆的矩阵。
- atolfloat, optional
绝对阈值项,默认值为0。
1.7.0 版本新增。
- rtolfloat, optional
相对阈值项,默认值为
max(M, N) * eps
,其中eps
是a
数据类型的机器精度值。1.7.0 版本新增。
- return_rankbool, optional
如果为 True,返回矩阵的有效秩。
- check_finitebool, optional
是否检查输入矩阵仅包含有限数。禁用此项可能会提高性能,但如果输入确实包含无穷大或 NaN,则可能导致问题(崩溃,不终止)。
- 返回:
- B(N, M) ndarray
矩阵 a 的伪逆。
- rankint
矩阵的有效秩。如果 return_rank 为 True,则返回此值。
- 抛出:
- LinAlgError
如果 SVD 计算不收敛。
另请参阅
pinvh
Hermitian 矩阵的 Moore-Penrose 伪逆。
说明
如果
A
是可逆的,则 Moore-Penrose 伪逆就是A
的逆 [1]。如果A
不可逆,则 Moore-Penrose 伪逆计算Ax = b
的x
解,使得||Ax - b||
最小化 [1]。参考文献
示例
给定一个
m x n
矩阵A
和一个n x m
矩阵B
,四个 Moore-Penrose 条件是:ABA = A
(B
是A
的广义逆),BAB = B
(A
是B
的广义逆),(AB)* = AB
(AB
是 Hermitian 矩阵),(BA)* = BA
(BA
是 Hermitian 矩阵)[1]。
这里,
A*
表示共轭转置。Moore-Penrose 伪逆是唯一满足所有这四个条件的B
,并且对于任何A
都存在。请注意,与标准矩阵逆不同,A
不必是方阵或具有线性独立的列/行。举个例子,我们可以计算一个随机非方阵的 Moore-Penrose 伪逆,并验证它是否满足这四个条件。
>>> import numpy as np >>> from scipy import linalg >>> rng = np.random.default_rng() >>> A = rng.standard_normal((9, 6)) >>> B = linalg.pinv(A) >>> np.allclose(A @ B @ A, A) # Condition 1 True >>> np.allclose(B @ A @ B, B) # Condition 2 True >>> np.allclose((A @ B).conj().T, A @ B) # Condition 3 True >>> np.allclose((B @ A).conj().T, B @ A) # Condition 4 True