[SciPy-User] Sigmoid Curve Fitting
Chris Spencer
chrisspen@gmail....
Tue Sep 21 08:13:07 CDT 2010
Thank you. Since that feature only appears to be in the bleeding-edge
version, it took me a while to track-down and compile all the
libraries on Ubuntu 10.04, but it works perfectly.
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
>
>
More information about the SciPy-User
mailing list