【问题标题】:scipy curve_fit fails on easy linear fit?scipy curve_fit 在简单的线性拟合上失败?
【发布时间】:2016-02-25 20:46:00
【问题描述】:

我打算用两个长度为 54 的 numpy 数组 y1y2 进行简单的线性拟合。函数定义如下:

def f(x,b):
    return b*x

数据绘制在这里:

然后我尝试通过以下方式进行拟合:

popt, pcov = scop.curve_fit(f,y2,y1)  # yes y1 and y2 are in right order

结果:popt = 1., pcov = inf

我尝试使用p0 = -833,这或多或少应该是结果,但它给了我popt = -833, pcov = inf

我用示例函数尝试了一些示例数据:

x = np.array(range(10))
y = x**2 + 3
def fu(x,b):
    return x**2 + b
po, pc = scop.curve_fit(fu,x,y)
print po, pc

结果很好:3 和 2e-33

有人知道第一次试验出了什么问题吗?我还没有发现任何有用或与我的问题相关的内容...

【问题讨论】:

  • 您是否检查过您的数据是否包含任何 NaN 或无限值?
  • 是的,有 NaN。 curve_fit 没有 NaN 处理程序吗?有解决办法吗?
  • 来自docs: "check_finite : bool, optional 如果为True,检查输入数组是否不包含infs的nans,如果包含则引发ValueError。将此参数设置为False如果输入数组确实包含 nans,则可能会默默地产生无意义的结果。默认为 True。"
  • @wflynny 该参数已添加到 scipy v0.15.0 - OP 可能有旧版本
  • @Robert:NaN 问题是一个很好的例子,说明了为什么你应该给出一个minimal reproducible example 而不是仅仅发布一个情节——问题归结为一个关于你的数据的事实,而你没有想到要提到,有人不得不猜测。

标签: python numpy scipy mathematical-optimization curve-fitting


【解决方案1】:

NaN 值将产生无意义的结果 - 在进行任何拟合之前,您需要将它们从数据中排除。您使用布尔索引来执行此操作:

valid = ~(np.isnan(y1) | np.isnan(y2))
popt, pcov = scop.curve_fit(f, y2[valid], y1[valid])

如 cmets 中所述,in versions of scipy newer than 0.15.0curve_fit 将自动检查输入数组中的 NaN 和 Infs,如果找到它们将引发 ValueError。可以选择使用check_finite parameter 禁用此行为。

根据您的问题和 cmets,我假设您必须使用旧版本 - 您可能应该考虑升级。

【讨论】:

    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2020-07-12
    • 2020-05-05
    相关资源
    最近更新 更多