[Numpy-discussion] Combining Sigmoid Curves
Angus McMorland
amcmorl at gmail.com
Fri May 2 16:07:23 EDT 2008
2008/5/2 Rich Shepard <rshepard at appl-ecosys.com>:
> When I last visited I was given excellent advice about Gaussian and other
> bell-shaped curves. Upon further reflection I realized that the Gaussian
> curves will not do; the curve does need to have y=0.0 at each end.
>
> I tried to apply a Beta distribution, but I cannot correlate the alpha and
> beta parameters with the curve characteristics that I have.
>
> What will work (I call it a pi curve) is a matched pair of sigmoid curves,
> the ascending curve on the left and the descending curve on the right. Using
> the Boltzmann function for these I can calculate and plot each individually,
> but I'm having difficulty in appending the x and y values across the entire
> range. This is where I would appreciate your assistance.
>
> The curve parameters passed to the function are the left end, right end,
> and midpoint. The inflection point (where y = 0.5) is half-way between the
> ends and the midpoint.
>
> What I have in the function is this:
>
> def piCurve(ll, lr, mid):
> flexL = (mid - ll)/2.0
> flexR = (lr - mid)/2.0
> tau = (mid - ll)/10.0
>
> x = []
> y = []
>
> xL = nx.arange(ll,mid,0.1)
> for i in xL:
> x.append(xL[i])
> yL = 1.0 / (1.0 + nx.exp(-(xL-flexL)/tau))
> for j in yL:
> y.append(yL[j])
>
> xR = nx.arange(mid,lr,0.1)
> for i in xR:
> x.append(xR[i])
> yR = 1 - (1.0 / (1.0 + nx.exp(-(xR-flexR)/tau)))
> for j in yR:
> y.append(yR[j])
>
> appData.plotX = x
> appData.plotY = y
>
> Python complains about adding to the list:
>
> yL = 1.0 / (1.0 + nx.exp(-(x-flexL)/tau))
> TypeError: unsupported operand type(s) for -: 'list' and 'float'
>
> What is the appropriate way to generate two sigmoid curves so that the x
> values range from the left end to the right end and the y values rise from
> 0.0 to 1.0 at the midpoint, then lower to 0.0 again?
How about multiplying two Boltzmann terms together, ala:
f(x) = 1/(1+exp(-(x-flex1)/tau1)) * 1/(1+exp((x-flex2)/tau2))
You'll find if your two flexion points get too close together, the
peak will drop below the maximum for each individual curve, but the
transition will be continuous.
Angus.
--
AJC McMorland, PhD candidate
Physiology, University of Auckland
(Nearly) post-doctoral research fellow
Neurobiology, University of Pittsburgh
More information about the NumPy-Discussion
mailing list