【问题标题】:Fitting only 2 paramter of a function with many parameters in python在python中仅拟合具有许多参数的函数的2个参数
【发布时间】:2016-09-21 19:34:22
【问题描述】:

我知道有个问题
Fitting only one parameter of a function with many parameters in python
但我有一点不同的情况。 lambda函数的参数问题。

我正在尝试拟合洛伦兹函数

def lorentz(ph, A, xc, w, f0):
    return f0 + A * w**2 / (w**2 + (ph - xc)**2)

如果我只拟合一个参数 (xc),它的工作效果很好。

p1, p2, p3, p4 = params
popt, pcov = curve_fit(lambda x, xc: lorentz(x, p1, xc, p3, p4), abjd, adata, bounds=param_bounds)

但如果我尝试仅拟合 2 个参数 (a, xc) 则会失败

p1, p2, p3, p4 = params    
popt, pcov = curve_fit(lambda x, a, xc: lorentz(x, a, xc, p3, p4), abjd, adata, bounds=param_bounds)

错误信息是

Traceback (most recent call last):
  File "template.py", line 294, in <module>
    popt, pcov = curve_fit(lambda x, a, xc: lorentz(x, a, xc, p3, p4), abjd, adata, bounds=param_bounds)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 683, in curve_fit
    **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 769, in least_squares
    f0 = fun_wrapped(x0)
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/_lsq/least_squares.py", line 764, in fun_wrapped
    return np.atleast_1d(fun(x, *args, **kwargs))
  File "/usr/local/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 455, in func_wrapped
    return func(xdata, *params) - ydata
TypeError: <lambda>() takes exactly 3 arguments (2 given)

【问题讨论】:

    标签: python lambda scipy curve-fitting


    【解决方案1】:

    这是洛伦兹函数所有4个参数的解

    import numpy as np
    from scipy.optimize import curve_fit
    
    def lorentz(ph, A, xc, w, f0):
        return f0 + A * w**2 / (w**2 + (ph - xc)**2)
    
    A, xc, w, f0 = 2,2,2,2  # true values
    ph = np.linspace(-5, 10, 100)
    y = lorentz(ph, A, xc, w, f0)    
    ydata = y + 0.15 * np.random.normal(size=len(ph)) # sample data
    popt, pcov = curve_fit(lambda x, _A, _xc: lorentz(x, _A, _xc, w, f0), ph, ydata,bounds=([1,1], [3, 3]))
    A, xc = popt # fitted values (only two)
    

    您可以通过将参数放在函数 lorentz() 下或使用 lambda 轻松添加或删除参数

    结果如下所示

    【讨论】:

    • 无法理解。你能写出适合 2 个参数的例子吗?
    • 是的,它有效。谢谢。问题出在参数bounds=param_bounds 中,如果我删除它,它的工作正常。但我真的需要它
    • 我又修改了。它与边界正常工作。
    • 我忘了为第二个参数添加边界。它从头开始工作,错误信息不清楚,我开始在错误的地方寻找错误
    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多