numpy.polyfit 返回空的残差数组

6 投票
1 回答
3866 浏览
提问于 2025-04-28 03:58

我使用numpy.polyfit这个工具来给一组数据拟合一个二次多项式。

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

在我的一些数据例子中,变量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 = []

我知道把一个二次多项式拟合到三点数据上不是很有用,但我还是希望这个函数要么给我一个警告,要么(因为它确实进行了拟合)返回实际的残差,或者两者都有(比如“这是残差,但你的条件很差!”)。

暂无标签

1 个回答

6

正如@Jaime所指出的,如果你有三个点,那么一个二次多项式可以完美地拟合这三个点。你提到的错误应该是0而不是一个空数组,这个说法是有道理的,但这就是np.linalg.lstsq目前的表现,np.polyfit就是基于这个功能的

我们可以通过对一个已知答案的方程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]))

在这里我们可以看到第二个输出是一个空数组。而且这就是它被设计成这样的原因

撰写回答