使用 SciPy 拟合指数函数的曲线
Curve fitting an exponential function using SciPy
我有以下 "score" 函数,这意味着为特定测量给出 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=1
和 b=1
,这不是很合身。一个好的拟合应该是 a=1800
和 b=-0.001667
,它给出了红线(蓝色数据)。
原因可能是没有指定起始条件。如果你给它一些合理的数字,那么 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)
我有以下 "score" 函数,这意味着为特定测量给出 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=1
和 b=1
,这不是很合身。一个好的拟合应该是 a=1800
和 b=-0.001667
,它给出了红线(蓝色数据)。
原因可能是没有指定起始条件。如果你给它一些合理的数字,那么 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)