【问题标题】:Problem with matrix inversion in python: ( A⁻ⁱA ≠ I )python中矩阵求逆的问题:(A⁻ⁱA≠I)
【发布时间】:2020-12-20 01:10:35
【问题描述】:

我遇到了一个有趣的 python 问题。我试图反转 3x3 矩阵 A

[[1 2 3]
[4 5 6]
[7 8 9]]

然后将其与初始值相乘:A⁻ⁱA。而不是单位矩阵(所有对角线元素都等于一个)我有这个:

[[ 12.   8.   8.]
 [-16.  -8.   0.]
 [  4.   0.   0.]]

仅在这种特定情况下才会出现问题。具有其他值的矩阵会给出正确的结果。代码如下:

import numpy as np
np.set_printoptions(precision=2,suppress=True)

A = np.array([1,2,3,4,5,6,7,8,9])
A = A.reshape(3,3)

print(A)
print(np.linalg.det(A))
print(np.matmul(np.linalg.inv(A),A))

输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

6.66133814775094e-16

[[ 12.   8.   8.]
 [-16.  -8.   0.]
 [  4.   0.   0.]] 

【问题讨论】:

  • 矩阵的行列式为 0,因此不可逆。 Python 3.6 在尝试反转时告诉我很多:numpy.linalg.LinAlgError: Singular matrix
  • 这是一个奇异矩阵。它没有逆。

标签: python numpy linear-algebra


【解决方案1】:

您的矩阵是不可逆的,请参见例如wolfram alpha,表示矩阵是奇异的。

您可能会误认为 Python 打印了一个非零值的行列式 (6.66133814775094e-16),但是,该值非常接近 0,因此您应该这样对待它。计算机对浮点数执行的操作通常并不完全准确(例如,请参阅这个问题 Why are floating point numbers inaccurate?),这可能是行列式的值接近于零但并不完全准确的原因。

【讨论】:

    【解决方案2】:

    这个矩阵的行列式是0。因为

    import numpy as np
    np.set_printoptions(precision=2,suppress=True)
    
    A = np.array([1,2,3,4,5,6,7,8,9])
    A = A.reshape(3,3)
    # print determinant
    print(np.linalg.det(A))
    

    返回

    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    0.0
    

    你有一个没有可计算逆矩阵。

    【讨论】:

      【解决方案3】:

      正如其他人所指出的,奇异矩阵是不可逆的,所以你从 A^-1 A 得到一个无意义的答案。

      Numpy 包含一个方便的功能来检查condition number

      np.linalg.cond(A)
      # 5.0522794445385096e+16
      

      正如维基百科所述,这是对Ax = b 中的输出值bA 中矩阵值的微小变化的敏感度的度量(有点像广义导数)。较大的值表示A 是“条件错误的”,并且可能导致值不稳定。这是实值矩阵固有的,但可能会因浮点运算而恶化。

      cond 比查看np.linalg.det(A) 更有用,因为它对A 中的值的比例不敏感(而规范和行列式是)。举个例子,这是一个值很小的矩阵,但在可逆性方面确实没有问题:

      A = 1e-10*np.random.random(size=(3,3))
      
      np.linalg.det(A)
      # 2.128774239739163e-31
      # ^^ this looks really bad...
      
      np.linalg.cond(A)
      # 8.798791503909136
      # nevermind, it's probably ok
      
      A_ident = np.matmul(np.linalg.inv(A), A)
      np.linalg.norm(A_ident - np.identity(3))
      # 5.392490230798587e-16
      # A^(-1)*A is very close to the identity matrix, not il-conditioned.
      

      【讨论】:

      • 我知道奇异矩阵和浮点数的棘手行为,但不确定情况是否如此。据我了解,要使用np.linalg.cond 函数确定矩阵是否可逆,我应该注意返回值与零有很大不同。如果我误解了,请纠正我。
      • 这是正确的:它实际上是对变化敏感度的衡量标准。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多