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

2Ob*_*Obe 6 python numpy matrix linear-algebra linear-regression

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

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]]
Run Code Online (Sandbox Code Playgroud)

第一个输出,即pinv的输出是正确的输出,另外在numpy.linalg.pinv()文档中推荐.但是为什么这个以及inv()和pinv()之间的差异/优点/缺点在哪里.

Ved*_*tty 9

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

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

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

您可以在此处详细了解伪逆算的工作原理

  • 我真的不想成为无助的人。但请查看矩阵逆和摩尔-彭罗斯逆的公式。这实际上是一个数学概念。 (2认同)

per*_*sse 8

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

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