使用Python对数据拟合sigmoid函数("S "形曲线)。

问题描述 投票:12回答:1

我试图对我的一些数据拟合一个sigmoid函数,但我一直得到。ValueError: Unable to determine number of fit parameters.

我的数据是这样的

enter image description here

我的代码是:

from scipy.optimize import curve_fit

def sigmoid(x):
    return (1/(1+np.exp(-x)))

popt, pcov = curve_fit(sigmoid, xdata, ydata, method='dogbox')

然后我得到:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-78540a3a23df> in <module>
      2     return (1/(1+np.exp(-x)))
      3 
----> 4 popt, pcov = curve_fit(sigmoid, xdata, ydata, method='dogbox')

~\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    685         args, varargs, varkw, defaults = _getargspec(f)
    686         if len(args) < 2:
--> 687             raise ValueError("Unable to determine number of fit parameters.")
    688         n = len(args) - 1
    689     else:

ValueError: Unable to determine number of fit parameters.

我不知道为什么不能用,这看起来是个很简单的动作--> 拟合一条曲线到某个点。所需的曲线应该是这样的。

enter image description here

对不起,我的图形... 我是用PowerPoint做的...

我怎样才能找到最佳的sigmoid("S "形)曲线?

更新

感谢@Brenlla,我把我的代码改成了。

def sigmoid(k,x,x0):
    return (1 / (1 + np.exp(-k*(x-x0))))

popt, pcov = curve_fit(sigmoid, xdata, ydata, method='dogbox')

现在我没有收到错误信息,但曲线没有达到预期的效果。

x = np.linspace(0, 1600, 1000)
y = sigmoid(x, *popt)

plt.plot(xdata, ydata, 'o', label='data')
plt.plot(x,y, label='fit')
plt.ylim(0, 1.3)
plt.legend(loc='best')

而结果是:

enter image description here

我怎样才能改进它,使它更适合数据?

更新2

代码是现在。

def sigmoid(x, L,x0, k, b):
    y = L / (1 + np.exp(-k*(x-x0)))+b

但结果还是...

enter image description here

更新3

在@Brenlla的大力帮助下,代码被修改为。

def sigmoid(x, L ,x0, k, b):
    y = L / (1 + np.exp(-k*(x-x0)))+b
    return (y)

p0 = [max(ydata), np.median(xdata),1,min(ydata)] # this is an mandatory initial guess

popt, pcov = curve_fit(sigmoid, xdata, ydata,p0, method='dogbox')

结果是:

enter image description here

python-3.x scipy curve-fitting sigmoid
1个回答
0
投票

在 @Brenlla 的帮助下,我把代码修改成了。

def sigmoid(x, L ,x0, k, b):
    y = L / (1 + np.exp(-k*(x-x0)))+b
    return (y)

p0 = [max(ydata), np.median(xdata),1,min(ydata)] # this is an mandatory initial guess

popt, pcov = curve_fit(sigmoid, xdata, ydata,p0, method='dogbox')

结果是:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.