使用下面的代码,我无法将 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 将使求解器收敛到一个合适的解决方案。
