【问题标题】:Curve fitting an exponential function using SciPy使用 SciPy 拟合指数函数的曲线
【发布时间】:2017-02-22 09:42:53
【问题描述】:

我有以下“分数”功能,意思是为某个测量给出介于 0 和 1 之间的分数,如下所示:

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

我想把它装到下面的 x 和 y 天:

x = np.array([4000, 2500, 2000, 1000,  500])
y = np.array([ 0.1,  0.3,  0.5,  0.7,  0.9])

curve_fit 似乎不起作用:

popt, pcov = curve_fit(func, x, y)

当我尝试用线性函数 curve_fit 拟合它时,它给出了一个很好的拟合(在绿线中),但是上面的指数函数只给出了 a=1b=1,这不是一个很好的拟合。一个好的拟合应该是a=1800b=-0.001667,这给出了红线(蓝色数据)。

【问题讨论】:

  • 您能否提供更多代码,包括情节?这样别人就更容易提供帮助了。

标签: python scipy curve-fitting


【解决方案1】:

原因很可能是没有指定启动条件。如果你给出一些合理的数字,那么curve_fit 更有可能收敛。下面是一个具有一些合理起始条件的示例:

from scipy.optimize import curve_fit

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

x = np.array([4000., 2500., 2000., 1000.,  500.])
y = np.array([ 0.1,  0.3,  0.5,  0.7,  0.9])

popt, pcov = curve_fit(func, x, y, p0=[2000., 0.005])

plot(x, y, 'x')
xx = linspace(0, 4000, 100)
yy = func(xx, *popt)
plot(xx, yy, lw=5)

【讨论】:

  • 你能告诉我我们如何识别初始参数值吗?在您的示例中,您是如何选择 2000 和 0.005 的?
  • 我查看了需要拟合的数据和函数。例如,从 x 中减去 a,因此应该是相同的比例。那么b 可能需要按 1e-3 的顺序排列,否则 np.exp(-b*(x-a)) 会发生很大变化。
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2012-12-30
  • 2017-08-29
  • 2017-04-21
  • 2014-12-02
  • 2016-01-22
相关资源
最近更新 更多