如果我们想通过使用以下正规方程来搜索线性回归模型的最佳参数θ:
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()之间的差异/优点/缺点在哪里。
答案 0 :(得分:5)
如果矩阵的行列式为零,则它不会有逆,并且你的inv函数将不起作用。如果您的矩阵是单数的,通常会发生这种情况。
但是pinv会。这是因为pinv在可用时返回矩阵的倒数,而在不可用时返回伪逆。
函数的不同结果是由于浮点运算中的舍入误差
您可以阅读有关伪逆功能here
的更多信息答案 1 :(得分:5)
inv
和pinv
用于计算(伪) - 反向作为独立矩阵。不要在计算中实际使用它们。
对于这样的线性系统解决方案,如果你有一个非可逆系数矩阵或numpy.linalg.lstsq
(或来自scipy)可逆矩阵,那么使用的正确工具是numpy.linalg.solve
(或来自scipy)。