2014-10-17 118 views
5

我使用numpy.polyfit以适合第二顺序多项式到的一组数据的numpy.polyfit给出空残差阵列

fit1, fit_err1, _, _, _ = np.polyfit(xint[:index_max], yint[:index_max], 2, full=True)

对于我的数据的一些几个例子中,可变fit_err1是空虽然fit是成功的,即fit1不是空的!

有没有人知道在这种情况下什么是空的残余手段?谢谢!

编辑: 一个示例数据集:

x = [-488., -478., -473.] 
y = [ 0.02080881, 0.03233648, 0.03584448] 

fit1, fit_err1, _, _, _ = np.polyfit(x, y, 2, full=True) 

结果:

fit1 = [ -3.00778818e-05 -2.79024663e-02 -6.43272769e+00] 
fit_err1 = [] 

我知道,一个2阶多项式拟合到一组三点是不是很有用,但后来我仍然期望函数要么提出警告,要么(因为它实际上确定了适合)返回实际残差,或者两者都一样(例如“这里是残差,但是你的条件很差!”)。

+2

你能给出一些导致这种行为的数据的例子吗? – 2014-10-17 16:40:19

+3

二阶多项式可以精确地拟合三个点,所以残差全部为零。如果没有残差的唯一情况是当点的数量恰好比多项式的数量多一个时,这就是你对发生了什么的解释。 – Jaime 2014-10-17 18:04:33

+0

@Jaime:好点!但是,如果拟合精确,我预计残差比[]更0,不是吗? – jkalden 2014-10-17 20:25:34

回答

5

正如@Jaime所指出的那样,如果您有三个点,那么二阶多项式将完全适合它。和你的观点相比,错误应该是相当于0比空数组更有意义,但这是np.linalg.lstsqwhich is where np.polyfit is wrapped around的当前行为。

我们可以测试这种行为做最小二乘法拟合一个y = a*x**0 + b*x**1 + c*x**2式的,我们知道答案应该是a=0, b=0, c=1

np.linalg.lstsq([[1, 1 ,1], [1, 2, 4], [1, 3, 9]], [1, 4, 9]) 
#(array([ -3.43396424e-15, 3.88578059e-15, 1.00000000e+00]), 
# array([], dtype=float64), 
# 3, 
# array([ 10.64956309, 1.2507034 , 0.15015641])) 

在这里我们可以看到第二个输出是一个空数组。和this is intended to work like this

+0

谢谢你@Saullo Castro!我仍然没有得到空值返回值的意图,但至少现在我知道这是空的意向,即不是一个错误,而是一个功能! – jkalden 2014-10-18 13:28:55

+1

@jkalden请记住'NumPy'不断发展,欢迎您在邮件列表中贡献讨论此主题([email protected]) – 2014-10-18 15:23:32

+1

因此,重要的是,在当前的实践中,空阵列意味着它恰好适合? – Keith 2016-05-18 00:33:19