python - 为什么 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]])
解决方案
看完 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 使用这种方法。
推荐阅读
- electron - 没有任何错误消息时如何调试 Electron.JS?
- sharepoint-online - SharePoint Online 在页面上显示用户配置文件信息
- windows - Windows Linux 子系统:无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护程序。docker 守护进程是否正在运行?
- reactjs - 分页未显示所需的页数
- python - 在每个页面上访问 CreateView 表单模式
- r - 如何在圆形图中添加显着性圆圈?
- c++ - 按结构的给定成员对结构数组进行排序(快速排序)
- stream - 如何在 Flink 中将 ListState 用于 BroadcastProcessFunction
- vue.js - 如何在我的 Go Daddy 主机中部署仍在开发中的 Vue JS 应用程序?
- python-3.x - numpy.sum 可以应用 [:] 的每个索引吗?