使用SciPy曲线拟合指数函数

时间:2017-02-22 09:42:54

标签: python scipy curve-fitting

我有以下"得分"函数,意味着为某个测量给出0到1之间的分数,如下所示:

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

我想把它放到下面的x和y daya:

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)

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

1 个答案:

答案 0 :(得分:3)

原因很可能是未指定起始条件。如果你给它一些合理的数字,那么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)

enter image description here