[SciPy-User] How to fit a curve/function?

josef.pktd at gmail.com josef.pktd at gmail.com
Wed Jun 8 10:12:58 EDT 2011


On Wed, Jun 8, 2011 at 9:41 AM, Johannes Radinger <JRadinger at gmx.at> wrote:
>
> -------- Original-Nachricht --------
>> Datum: Wed, 8 Jun 2011 07:10:38 -0400
>> Von: josef.pktd at gmail.com
>> An: SciPy Users List <scipy-user at scipy.org>
>> Betreff: Re: [SciPy-User] How to fit a curve/function?
>
>> On Wed, Jun 8, 2011 at 6:52 AM, Johannes Radinger <JRadinger at gmx.at>
>> wrote:
>> > Hello,
>> >
>> > I've got following function describing any kind of animal dispersal
>> kernel:
>> >
>> > def pdf(x,s1,s2):
>> >    return
>> (p/(math.sqrt(2*math.pi*s1**2))*numpy.exp(-((x-0)**(2)/(2*s1**(2)))))+((1-p)/(s2*math.sqrt(2*math.pi))*numpy.exp(-((x-0)**(2)/(2*s2**(2)))))
>> >
>> > On the other hand I've got data from literature with which I want to fit
>> the function so that I get s1, s2 and x.
>> > Ususally the data in the literature are as follows:
>> >
>> > Example 1: 50% of the animals are between -270m and +270m and 90%  are
>> between -500m and + 500m
>> >
>> > Example 2: 84% is between - 5000 m and +5000m, and 73% are between
>> -1000m and +1000m
>> >
>> > So far as I understand an integration of the function is needed to solve
>> for s1 and s2 as all the literature data give percentage (area under the
>> curve) Can that be used to fit the curve or can that create ranges for s1
>> and s2.
>>
>> I don't see a way around integration.
>>
>> If you have exactly 2 probabilities, then you can you a solver like
>> scipy.optimize.fsolve to match the probabilites
>> eg.
>> 0.5 = integral pdf from -270 to 270
>> 0.9 = integral pdf from -500 to 500
>>
>> If you have more than 2 probabilities, then using optimization of a
>> weighted function of the moment conditions would be better.
>>
>> Josef
>
>
>
> Hello again
>
> I tried following, but without success so far. What do I have to do excactly...
>
> import numpy
> from scipy import stats
> from scipy import integrate
> from scipy.optimize import fsolve
> import math
>
> p=0.3
>
> def pdf(x,s1,s2):
>    return (p/(math.sqrt(2*math.pi*s1**2))*numpy.exp(-((x-0)**(2)/(2*s1**(2)))))+((1-p)/(s2*math.sqrt(2*math.pi))*numpy.exp(-((x-0)**(2)/(2*s2**(2)))))
>
> def equ(s1,s2):
>    0.5==integrate.quad(pdf,-270,270,args=(s1,s2))
>    0.9==integrate.quad(pdf,-500,500,args=(s1,s2))
>
> result=fsolve(equ, 1,500)
>
> print result

equ needs to return the deviation of the equations (I changed some
details for s1 just to try it)

import numpy
from scipy import stats
from scipy import integrate
from scipy.optimize import fsolve
import math

p=0.3

def pdf(x,s1,s2):
    return (p/(math.sqrt(2*math.pi*s1**2))*numpy.exp(-((x-0)**(2)/(2*s1**(2)))))+((1-p)/(math.sqrt(2*math.pi*s2**2))*numpy.exp(-((x-0)**(2)/(2*s2**(2)))))

def equ(arg):
    s1,s2 = numpy.abs(arg)
    cond1 = 0.5 - integrate.quad(pdf,-270,270,args=(s1,s2))[0]
    cond2 = 0.9 - integrate.quad(pdf,-500,500,args=(s1,s2))[0]
    return [cond1, cond2]

result=fsolve(equ, [200., 1200])

print result

but in the results I get the parameters are very close to each other
[-356.5283675   353.82544075]

the pdf looks just like a mixture of 2 normals both with loc=0, then
maybe the cdf of norm can be used directly

>>> from scipy import stats
>>> stats.norm.cdf(270, scale=350) - stats.norm.cdf(-270, scale=350)
0.55954705470577526
>>>
>>> stats.norm.cdf(270, scale=354) - stats.norm.cdf(-270, scale=354)
0.55436474670960978
>>> stats.norm.cdf(500, scale=354) - stats.norm.cdf(-500, scale=354)
0.84217642881921018

Josef
>
>
> /Johannes
>>
>> >
>> > /Johannes
>> >
>> > --
>> > NEU: FreePhone - kostenlos mobil telefonieren!
>> > Jetzt informieren: http://www.gmx.net/de/go/freephone
>> > _______________________________________________
>> > SciPy-User mailing list
>> > SciPy-User at scipy.org
>> > http://mail.scipy.org/mailman/listinfo/scipy-user
>> >
>> _______________________________________________
>> SciPy-User mailing list
>> SciPy-User at scipy.org
>> http://mail.scipy.org/mailman/listinfo/scipy-user
>
> --
> NEU: FreePhone - kostenlos mobil telefonieren!
> Jetzt informieren: http://www.gmx.net/de/go/freephone
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>



More information about the SciPy-User mailing list