【问题标题】:Nonlinear regression(globally) with shared parameters in python by using curve_fit使用curve_fit在python中具有共享参数的非线性回归(全局)
【发布时间】:2021-06-19 15:05:53
【问题描述】:

我正在尝试使用一组数据对非线性系统进行回归。

import numpy as np
xdata = np.array([3, 6, 9, 12, 24])  #ydata1 and ydata2 use the same xdata
ydata1 = np.array([5e-4, 5.03e-4, 4.56e-4, 4,89e-4, 4.85e-4])
ydata2 = np.array([1.7e-3, 1.74e-3, 1.64e-3, 1.74e-3, 1.69e-3])
xdata3 = np.array([3, 6, 9, 18])
ydata3 = np.array([2.74e-3, 2.68e-3, 2.62e-3, 2.92e-3])

除了一个参数p1之外,这三行使用相同的功能,我知道是否有一个简单的例子来说明如何使用curve_fit同时(全局)解决这个系统。非常感谢!

def func(a, b, x):
    return a * b * p1 * x / ((1 + np.sqrt(b * x)) ** 2)
    ### p1 is 6, 18, 30 for ydata1, ydata2, ydata3

【问题讨论】:

  • 您好,欢迎您。我的提示,只需使用least_squares。可以找到一个例子here

标签: python regression curve-fitting


【解决方案1】:

使用部分功能工具。 而不是使用curve_fit(xdata, ydata, func) 三次,您将拥有:

from functools import partial
f1 = partial(func, p1=6)
f2 = partial(func, p1=18)
f3 = partial(func, p1=30)
popt1, pcov1 = curve_fit(xdata, ydata1, f1)
popt2, pcov2 = curve_fit(xdata, ydata2, f2)
popt3, pcov3 = curve_fit(xdata3, ydata3, f3)
ydata1_fit = f1(xdata, *popt1)
ydata2_fit = f2(xdata, *popt2)
ydata3_fit = f3(xdata3, *popt3)

为了避免重复,我们可以把它塞进一个函数中。

def fitter(xdata, ydata, p1):
    f = partial(func, p1=p1)
    popt, pcov = curve_fit(xdata, ydata, f)
    ydata_fit = f(xdata, *popt)
    return ydata_fit

ydata1_fit = fitter(xdata, ydata1, 6)
ydata2_fit = fitter(xdata, ydata2, 18)
ydata3_fit = fitter(xdata3, ydata3, 30)

【讨论】:

  • 您好,非常感谢您的快速答复。我想我可能没有说清楚。我试图用两个共享参数(a,b)同时不独立地解决这个系统。 p1 对于不同的 y 数据集是不同的。你能给我一些建议吗?感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2016-06-29
  • 2013-12-24
  • 2018-03-11
相关资源
最近更新 更多