使用SciPy进行指数函数曲线拟合

3
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我有一个名为“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=1b=1,这不是一个好的拟合。一个好的拟合应该是a=1800b=-0.001667,这就得到了红线(蓝色数据)。


1
你能提供更多的代码,包括图表吗?这样别人就更容易帮助你了。 - Philipp
1个回答

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


请问如何确定初始参数值?在你的例子中,你是如何选择2000和0.005的? - Naveen
我查看了需要拟合的数据和函数。例如,从x中减去a,因此它可能应该在相同的尺度上。然后,b可能需要在1e-3的数量级上,否则np.exp(-b*(x-a))会有很大变化。 - J. P. Petersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接