【问题标题】:passing arguments to a function for fitting将参数传递给函数以进行拟合
【发布时间】:2012-04-27 04:36:04
【问题描述】:

我正在尝试拟合一个函数,该函数将 2 个自变量 x、y 和 3 个参数作为输入,以找到 a、b、c。这是我的测试代码:

import numpy as np
from scipy.optimize import curve_fit

def func(x,y, a, b, c):
    return a*np.exp(-b*(x+y)) + c    

y= x = np.linspace(0,4,50)
z = func(x,y, 2.5, 1.3, 0.5) #works ok
#generate data to be fitted
zn = z + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!!

但我收到错误消息:“func() 恰好需要 5 个参数(给定 51 个)”。如何正确传递我的参数 x,y?

【问题讨论】:

  • curve_fit 的文档对func 参数有何评论?显然它试图用 51 个参数调用它,所以也许你应该重新阅读文档。

标签: python numpy scipy curve-fitting


【解决方案1】:

只需查看documentation of scipy.optimize.curve_fit() 即可。原型是

scipy.optimize.curve_fit(f, xdata, ydata, p0=None, sigma=None, **kw)

文档声明curve_fit() 被调用,目标函数作为第一个参数,自变量作为第二个参数,因变量作为第三个参数,参数的起始值作为第四个参数。您尝试以完全不同的方式调用该函数,因此它不起作用也就不足为奇了。具体来说,您将zn 作为p0 参数传递——这就是为什么使用这么多参数调用函数的原因。

文档还描述了如何调用目标函数:

f: 可调用
模型函数,f(x, ...)。它必须将自变量作为第一个参数,并将适合的参数作为单独的剩余参数。

xdataN-length 序列或 (k,N)-形数组
对于具有 k 个预测变量的函数。测量数据的自变量。

您尝试使用分隔因变量的参数,而它应该是单个参数数组。这是修复的代码:

def func(x, a, b, c):
    return a * np.exp(-b * (x[0] + x[1])) + c    

N = 50
x = np.linspace(0,4,50)
x = numpy.array([x, x])          # Combine your `x` and `y` to a single
                                 # (2, N)-array
z = func(x, 2.5, 1.3, 0.5)
zn = z + 0.2 * np.random.normal(size=x.shape[1])
popt, pcov = curve_fit(func, x, zn)

【讨论】:

    【解决方案2】:

    尝试将前两个数组参数作为元组传递给func并修改func以接受参数元组

    通常预计curvefit 将接受 x 和 y 参数func(x) 作为输入以拟合曲线。奇怪的是,在您的示例中,因为您的 x 参数不是单个值而是两个值(不知道为什么),您必须修改您的函数,以便它接受 x 作为单个参数并在其中扩展它。

    一般来说,三维曲线拟合的处理方式应与您尝试实现的方式不同。您可以查看以下SO 帖子,该帖子试图用一条线拟合三维散点图。

    >>> def func((x,y), a, b, c):
        return a*np.exp(-b*(x+y)) + c
    
    >>> y= x = np.linspace(0,4,50)
    >>> z = func((x,y), 2.5, 1.3, 0.5) #works ok
    >>> zn = z + 0.2*np.random.normal(size=len(x))
    >>> popt, pcov = curve_fit(func, (x,y), zn)
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 2014-07-27
      • 2021-04-18
      相关资源
      最近更新 更多