numpy.polyfit 给出空残差数组

Posted

技术标签:

【中文标题】numpy.polyfit 给出空残差数组【英文标题】:numpy.polyfit gives empty residuals array 【发布时间】:2014-12-13 07:06:34 【问题描述】:

我使用 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 = []

我知道将二阶多项式拟合到一组三点不是很有用,但是我仍然希望该函数要么发出警告,要么(因为它实际上确定了拟合)返回实际残差,或者两者(比如“这是残差,但你的条件很差!”)。

【问题讨论】:

你能举个小例子说明导致这种行为的一些数据吗? 二阶多项式可以精确地拟合到三个点,因此残差都为零。如果唯一没有残差的情况是点数正好比多项式的阶数大一,这就是你对发生的事情的解释。 @Jaime:好点!但如果拟合是精确的,我希望残差为 0 而不是 [],不是吗? 您可能希望在numpy's github 上将其作为错误/功能请求打开。 如果精确匹配是这种奇怪行为的根本原因,那么您是对的!我会发邮件给 numpy 团队。 【参考方案1】:

正如@Jaime 所指出的,如果你有三个点,那么二阶多项式将完全适合它。您认为错误应该是0 而不是空数组是有道理的,但这是np.linalg.lstsq、which 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。

【讨论】:

谢谢@Saullo Castro!我仍然不明白空返回值背后的意图,但至少现在我知道它是空的,即不是错误,而是一个特性! @jkalden 请记住 NumPy 不断发展,欢迎您在邮件列表 (numpy-discussion@scipy.org) 中参与讨论该主题 所以要点是,在当前的实施中,一个空数组意味着它完全适合?

以上是关于numpy.polyfit 给出空残差数组的主要内容,如果未能解决你的问题,请参考以下文章

多个维度的 NumPy PolyFit 和 PolyVal?

numpy.polyfit 和 scipy.polyfit 有啥区别? [复制]

用犰狳在 C++ 中实现 numpy.polyfit 和 numpy.polyval

核心数据不同的提取给出空数组

将 JavaScript 数组传递给 IEnumerable 会给出空值

填充listView时数组自适应给出空指针异常