numpy.polyfit返回空的残差数组

6
我使用numpy.polyfit对一组数据进行二次多项式拟合。例如,对于某些数据,变量fit_err1为空,尽管拟合成功,即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
你能给一个小例子来说明导致这种行为的数据吗? - Roger Fan
3
可以通过二次多项式完全拟合三个点,因此残差将全部为零。如果仅在点数恰好比多项式的阶数多一时才不会出现残差,那么这就是所发生情况的解释。 - Jaime
1
@Jaime:好观点!但如果拟合是精确的,我希望残差是0而不是[],对吧? - jkalden
1
你可能想在 numpy 的 github 上开一个 bug/feature 请求。 - Jaime
如果确切的匹配是这种奇怪行为的根本原因,那么你是正确的!我会给Numpy团队发送一封邮件。 - jkalden
1个回答

6
正如@Jaime所指出的那样,如果你有三个点,一个二阶多项式将完全适配。你提出的错误应该是零而不是空数组的观点很有道理,但这是当前np.linalg.lstsq的行为,这就是np.polyfit所包装的地方。我们可以通过对我们已知答案为a=0, b=0, c=1y = a*x**0 + b*x**1 + c*x**2方程进行最小二乘拟合来测试这种行为。
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]))

我们可以看到第二个输出是一个空数组。而这是有意这样设计的


谢谢@Saullo Castro!我仍然不明白空返回值背后的意图,但至少现在我知道它是有意为空的,也就是说这不是一个错误而是一个特性! - jkalden
1
@jkalden请记住,NumPy不断发展,欢迎您在邮件列表(numpy-discussion@scipy.org)中讨论此话题并做出贡献。 - Saullo G. P. Castro
1
那么,结论是在当前实现中,空数组意味着它正好合适? - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接