[SciPy-User] Sigmoid Curve Fitting
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)))
but that only results in a curve of f(x)=0.5.
On Mon, Sep 20, 2010 at 11:54 PM, Warren Weckesser
> On 9/20/10 8:38 PM, Chris Spencer wrote:
>> Does Scipy contain the ability to fit a sigmoid curve to a set of data
>> I found some Numpy code
>> 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)
> This script generates the attached plot.
> SciPy-User mailing list
More information about the SciPy-User