首页 > 解决方案 > 为什么 numpy np.linalg.inv 在找到矩阵的逆时返回两个接近但不同的结果?

问题描述

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

由于矩阵数据类型在使用 '*' 运算符时使用向量乘法,我们不应该得到 [mT * m]^-1 = m^-1 * mT^-1
m^-1 * mT^-1 * mT = 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]])

标签: pythonnumpyopencvlinear-algebramatrix-inverse

解决方案


看完 Gilbert Strang 的讲座后我意识到
(AT * A)^-1 * AT 只给了我们左边的逆。当你写 (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 使用这种方法。


推荐阅读