用Python求矩阵的广义逆

时间: 2023-07-11 admin IT培训

用Python求矩阵的广义逆

用Python求矩阵的广义逆

文章目录

    • inv
    • 穆尔-彭罗斯广义逆
    • pinv

对于两个方阵 A , B A,B A,B,若 A B = E AB=E AB=E,且 E E E为单位阵,则 A , B A,B A,B互逆,可记作 A = B − 1 , B = A − 1 A=B^{-1}, B=A^{-1} A=B−1,B=A−1。

inv

numpyscipy中,均提供了求逆函数,分别是numpy.linalg.invscipy.lingalg.inv,下面举个例子看一下

import numpy as np
import numpy.linalg as nl
import scipy.linalg as slA = np.random.rand(3,3)

二者求逆的结果如下,是完全相同的

>>> nl.inv(A)
array([[  0.56940181,   7.07580181,  -2.80811204],[ -0.4241864 ,  -0.45826635,   1.51146259],[  1.80687147, -13.30035928,   2.91842045]])
>>> sl.inv(A)
array([[  0.56940181,   7.07580181,  -2.80811204],[ -0.4241864 ,  -0.45826635,   1.51146259],[  1.80687147, -13.30035928,   2.91842045]])

下面测试以下二者的计算时间

from timeit import timeit
A = np.random.rand(500,500)
timeit(lambda : nl.inv(A), number=100)
# 2.689510200000001
timeit(lambda : sl.inv(A), number=100)
# 0.5326764000000139

可见scipy.linalg.inv要比numpy更快。

穆尔-彭罗斯广义逆

有了逆这个概念,那么对于求解 A x = b Ax=b Ax=b这样的方程组就变得简单了, x x x可写为 x = A − 1 b x=A^{-1}b x=A−1b。

但并不是所有矩阵都有逆的,为了让 x = A − 1 b x=A^{-1}b x=A−1b这种形式拥有更广的适用范围,就必须拓展矩阵的逆的概念,此即广义逆。

对于复矩阵 A A A而言,若存在复矩阵 G G G,满足

  1. A G A = A AGA=A AGA=A
  2. G A G = G GAG=G GAG=G
  3. ( A G ) H = A G (AG)^H=AG (AG)H=AG
  4. ( G A ) H = G A (GA)^H=GA (GA)H=GA

其中 ∗ H *^H ∗H表示共轭转置,则称 G G G为 A A A的穆尔-彭罗斯广义逆,也叫加号逆,记作 G = A + G=A^+ G=A+。

scipy.linalg提供了两个求加号逆的矩阵,分别是pinvpinvh,分别用于实矩阵和复矩阵。

pinv

inv中,除了待求矩阵a之外,还有两个参数:overwrite_a默认为False,若为True,则在计算过程中覆盖acheck_finite默认False,若为True则进行有限性检查。

pinv, pinvh中,除了acheck_finite之外,还有下列参数:

  • atol, rtol 用于控制精度
  • return_rank 若为True,则返回矩阵的有效秩

下面以pinv为例,简单介绍一下函数的使用方法。

A = np.random.rand(3,4)
# sl.inv(A)会报错
G = sl.pinv(A)

接下来看一下 A A A和 A G A AGA AGA是否相等

>>> A
array([[0.06135389, 0.53545499, 0.52057907, 0.48222946],[0.65828574, 0.42574002, 0.09521576, 0.62040737],[0.86266928, 0.51081037, 0.11678121, 0.74462639]])
>>> A@G@A
array([[0.06135389, 0.53545499, 0.52057907, 0.48222946],[0.65828574, 0.42574002, 0.09521576, 0.62040737],[0.86266928, 0.51081037, 0.11678121, 0.74462639]])

可见二者是相等的。