2015-01-26 149 views
1

我有X,Y数据:计算残差与numpy的lstsq

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如果拦截设置为零,5478137如果那些被添加到x。

+0

奇怪。我从“小数点后六位”开始,在'ones'情况下的残差平方和的结果甚至略有不同:array([42727293.12864096]) – FuzzyDuck 2015-01-26 18:22:50

回答

2

lstsq将有一个适合该零列的困难时间:任何值的相应参数(大概是截取)将做。

要解决的截距为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])