为什么 numpy.linalg.pinv() 优于 numpy.linalg.inv() 在线性回归中创建矩阵的逆

新手上路,请多包涵

如果我们想通过使用以下正规方程来搜索线性回归模型的最佳参数 theta:

theta = inv(X^T * X) * X^T * y

第一步是计算 inv(X^T*X)。因此 numpy 提供了 np.linalg.inv()np.linalg.pinv()

虽然这会导致不同的结果:

 X=np.matrix([[1,2104,5,1,45],[1,1416,3,2,40],[1,1534,3,2,30],[1,852,2,1,36]])
y=np.matrix([[460],[232],[315],[178]])

XT=X.T
XTX=XT@X

pinv=np.linalg.pinv(XTX)
theta_pinv=(pinv@XT)@y
print(theta_pinv)

[[188.40031946]
 [  0.3866255 ]
 [-56.13824955]
 [-92.9672536 ]
 [ -3.73781915]]

inv=np.linalg.inv(XTX)
theta_inv=(inv@XT)@y
print(theta_inv)

[[-648.7890625 ]
 [   0.79418945]
 [-110.09375   ]
 [ -74.0703125 ]
 [  -3.69091797]]

第一个输出,即 pinv 的输出是正确的,并且在 numpy.linalg.pinv() 文档中另外推荐。但为什么会这样,inv() 和 pinv() 之间的区别/优点/缺点在哪里。

原文由 2Obe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

如果矩阵的行列式为零,则它不会有逆并且您的 inv 函数将不起作用。如果您的矩阵是奇异的,通常会发生这种情况。

但是pinv会。这是因为 pinv 在可用时返回矩阵的逆,而在不可用时返回伪逆。

函数的不同结果是由于浮点运算中的舍入误差

您可以 在此处 阅读有关伪逆如何工作的更多信息

原文由 Vedant Shetty 发布,翻译遵循 CC BY-SA 3.0 许可协议

invpinv 用于计算(伪)逆矩阵作为独立矩阵。不要在计算中实际使用它们。

对于此类线性系统解决方案,如果您有不可逆系数矩阵,则使用的正确工具是 numpy.linalg.lstsq (或来自 scipy)或 numpy.linalg.solve (或来自 scipy)用于可逆矩阵。

原文由 percusse 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题