为什么在线性回归中创建矩阵的逆时,numpy.linalg.pinv()比numpy.linalg.inv()更受欢迎

2024-05-18 08:44:19 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我们想通过使用正态方程来搜索线性回归模型的最优参数θ:

θ=投资(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()之间的区别/优缺点在哪里呢。


Tags: 模型numpy参数np线性matrixxt方程
2条回答

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

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

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

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

invpinv用于将(伪)逆作为独立矩阵计算。而不是在计算中使用它们。

对于这样的线性系统解,如果有不可逆系数矩阵,正确的工具是^{}(或来自scipy),对于可逆矩阵,正确的工具是^{}(或来自scipy)。

相关问题 更多 >