【问题标题】:Why does numpy np.linalg.inv returns two close but different result while finding inverse of a matrix?为什么 numpy np.linalg.inv 在找到矩阵的逆时返回两个接近但不同的结果?
【发布时间】:2021-12-20 22:23:35
【问题描述】:

我正在尝试查找 np.matrix 数据类型的逆(np.array 也相同)。在矩阵上调用 np.linalg.inverse 会产生两个接近但不同的结果。是什么原因造成的?哪一个比其他更可取?

由于矩阵数据类型在使用'*'运算符时使用向量乘法,我们不应该得到 [m.T * m]^-1 = m^-1 * m.T^-1
m^-1 * m.T^-1 * m.T = m^-1

结果1? 因此,结果 1 将等于结果 2。

我意识到我们计算结果 1 的方式是实现图像的透视投影矩阵的正确方法,因为它与 cv2.getPerspectiveTransform 给出了相同的结果。这有什么具体原因吗?

>>> m = np.matrix(v)
>>> m
>>> matrix([[  3.,   4.,   1.],
        [  2.,  44.,  55.],
        [ 99., 129., 343.]])

>>> res1 = np.linalg.inv(m.T * m) * m.T
>>> res2 = np.linalg.inv(m)

>>> res1
matrix([[ 0.2054252613732362, -0.0319299237072599,  0.0045210511443909],
        [ 0.122248195432692 ,  0.0238896452516133, -0.0041871098666807],
        [-0.1052685658506345,  0.000231190115337 ,  0.0031852860335482]])
>>> res2
matrix([[ 0.2054252613732693, -0.0319299237072619,  0.0045210511443911],
        [ 0.1222481954327108,  0.0238896452516119, -0.0041871098666804],
        [-0.1052685658506512,  0.0002311901153382,  0.0031852860335483]])

【问题讨论】:

  • 对浮点数的计算并不精确,因此两个结果都只是近似逆矩阵的精确值。例如,逆矩阵第一行第一列元素的实际值为727/3539。这个分数的十进制扩展的前30位是0.205425261373269285108787793162。
  • * 进行元素乘法。如果您想要矩阵乘法,请使用@(一个相对较新的中缀运算符)。 -- 转置通常等于倒置。注意这一点。在特殊情况下是相等的。
  • @ChristophRackwitz 对于np.matrix 对象* 实际上是矩阵乘法运算符。此外,在数学上,OP 使用的两个公式都给出了 m 的倒数。
  • 感谢@bb1 对主要问题的回答。您可能还想查看有关 opencv getPerspectiveTransform 问题的更多理论答案。

标签: python numpy opencv linear-algebra matrix-inverse


【解决方案1】:

看完吉尔伯特·斯特朗this的讲座后,我意识到
(A.T * A)^-1 * A.T 只给我们左侧逆。当你写 (A.T*A)^-1 * A.T * A = I 等于身份。然而, A * (A.T*A)^-1 * A.T(右侧)没有给我们身份。

作为结果使用res1 = np.linalg.inv(m.T * m) * m.T,我们得到伪逆解。由于当矩阵是奇异的时找到回归问题的解决方案很有用,我猜opencv使用这种方法。

【讨论】:

    猜你喜欢
    • 2021-05-11
    • 2017-06-23
    • 2021-02-23
    • 2021-03-20
    • 2017-06-07
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多