我有x,y数据:

import numpy as np
x = np.array([ 2.5, 1.25, 0.625, 0.3125, 0.15625, 0.078125])
y = np.array([ 2448636.,1232116.,617889.,310678.,154454.,78338.])

X = np.vstack((x, np.zeros(len(x))))
popt,res,rank,val = np.linalg.lstsq(X.T,y)
popt,res,rank,val


给我:

(array([ 981270.29919414,       0.        ]),
 array([], dtype=float64),
 1,
 array([ 2.88639894,  0.        ]))


为什么残差为零?如果我加一个而不是零,那么将计算残差:

X = np.vstack((x, np.ones(len(x)))) # added ones instead of zeros
popt,res,rank,val = np.linalg.lstsq(X.T,y)
popt,res,rank,val

(array([ 978897.28500355,    4016.82089552]),
array([ 42727293.12864216]),
2,
array([ 3.49623683,  1.45176681]))


另外,如果我在excel中计算残差的平方和,则将截距设为零,则得到9261214,如果将x加1,则得到5478137

最佳答案

lstsq很难适应零列:相应参数的任何值(可能是intercept)都可以。

要将截距固定为0(如果您需要这样做),只需发送x数组,但要确保它是lstsq的正确形状:

In [214]: popt,res,rank,val = np.linalg.lstsq(np.atleast_2d(x).T,y)
In [215]: popt
Out[215]: array([ 981270.29919414])
In [216]: res
Out[216]: array([ 92621214.2278382])

关于python - 用numpy lstsq计算残差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28155829/

10-12 22:41