Skip to main content
 首页 » 编程设计

python之为什么我无法使用 scipy.optimize.curve_fit 将 sigmoid 函数拟合到此数据

2025年05月04日17lyj

使用下面的代码,我无法将 S 形函数拟合到我的数据集。 但是,如果我在下面的代码中添加一个偏移量 t = x + 50 -x0,它就很合适。

x0 不应该负责装修吗?


import numpy as np 
import pylab 
from scipy.optimize import curve_fit 
 
listA = np.array([-110,-105,-100,-95,-90,-85,-80,-75,-70,-65,-60,-55,-50,-45]) 
listB = np.array([1,1,1,1,0.926470588,0.852941176,0.616803279,0.371212121, 
                  0.191066998,0.088565022,0.06684492,0.019855596,0.015517241,0]) 
 
def sigmoid(x,x0,k,y0): 
    t = x -x0                  
    y = y0-1/(1 + np.exp(-k*t)) 
    return y 
 
popt, pcov = curve_fit(sigmoid, listA, listB) 
print popt ,pcov     
 
x = np.linspace(-110,-45,50) 
 
y = sigmoid(x, *popt) 
 
pylab.plot(listA, listB, 'o', label='data') 
pylab.plot(x,y, label='fit') 
pylab.ylim(-0.05, 1.05) 
pylab.legend(loc='best') 
pylab.show() 

请您参考如下方法:

您遇到了初始条件敏感性的经典案例。 curve_fit 函数接受关键字参数 p0,它允许您为函数的自由参数选择一个初始“猜测”(在您的例子中,x0、k 和 y0)。

当没有提供 p0 时,scipy 假定所有参数 will start at one .对于您的函数,这意味着 sigmoid 的分母将非常接近于零,因此函数值会爆炸。这会混淆求解器并导致糟糕的解决方案。

不幸的是,这个问题没有唯一的解决方案,因为它需要了解您要拟合的函数的动态。在您的情况下,提供 (-30, 1, 0) 的 p0 将使求解器收敛到一个合适的解决方案。