[SciPy-User] Sigmoid Curve Fitting

Warren Weckesser warren.weckesser@enthought....
Mon Sep 20 22:54:44 CDT 2010


  On 9/20/10 8:38 PM, Chris Spencer wrote:
> Hi,
>
> Does Scipy contain the ability to fit a sigmoid curve to a set of data points?
>
> I found some Numpy code
> (http://pingswept.org/2009/01/24/least-squares-polynomial-fitting-in-python/)
> for fitting curves using the least squares method, but it only seems
> to fit parabolas to my sigmoid data.
>

You can use curve_fit (scipy.optimize.curve_fit).

Which family of sigmoid functions do you want to use?
See http://en.wikipedia.org/wiki/Sigmoid_function for a few possibilities.

If, for example, you want to fit the following family to your data:

f(x) = 1/(1 + exp(-k*(x-x0)))

(which has two parameters, k and x0), you can do something like this:

-----
import numpy as np
import pylab
from scipy.optimize import curve_fit

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

xdata = np.array([0.0,   1.0,  3.0, 4.3, 7.0,   8.0,   8.5, 10.0, 12.0])
ydata = np.array([0.01, 0.02, 0.04, 0.11, 0.43,  0.7, 0.89, 0.95, 0.99])

popt, pcov = curve_fit(sigmoid, xdata, ydata)
print popt

x = np.linspace(-1, 15, 50)
y = sigmoid(x, *popt)


pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()
-----

This script generates the attached plot.


Warren

-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 23138 bytes
Desc: not available
Url : http://mail.scipy.org/pipermail/scipy-user/attachments/20100920/a4d6431c/attachment-0001.png 


More information about the SciPy-User mailing list