# [SciPy-User] Sigmoid Curve Fitting

Chris Spencer chrisspen@gmail....
Tue Sep 21 10:24:09 CDT 2010

```Is it possible to get it to determine the asymptotes as well? It seems
to assume the curve will be bounded between y=0 and 1, whereas my data
can have arbitrary limits. I tried changing sigmoid() to:

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

but that only results in a curve of f(x)=0.5.

Regards,
Chris

On Mon, Sep 20, 2010 at 11:54 PM, Warren Weckesser
<warren.weckesser@enthought.com> wrote:
>  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
>
>
> _______________________________________________
> SciPy-User mailing list
> SciPy-User@scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
>
```