[SciPy-user] Fitting with global parameters optimize.leastsq

Steve Schmerler elcorto at gmx.net
Mon Nov 6 15:11:53 CST 2006


Iain Day wrote:
> Steve Schmerler wrote:
>> Iain Day wrote:
>>> Dear All,
>>>
>>> I apologise in advance if this has been covered elsewhere, I can't 
>>> seem to get my head around it.
>>>
>>> I'm trying to globally fit a series of traces to the same function 
>>> with some common and some local parameters. I have a 2D array 
>>> (raw_signals) which contains each data trace as its columns. I have a 
>>> 1D array of the time points.
>>>
>>> I'd like to fit an exponential of the form:
>>>     y(t) = A * exp(-t/B) + C
>>>
>>> and I'd like C to be global across all data sets, but A and B to be 
>>> local to each trace.
>>>
>>> So far I've put A and B into arrays ntraces long. I'm trying to keep 
>>> the code as general as possible as I've got lots to fit each with 
>>> differing numbers of traces.
>>>
>>> I've followed the example on the SciPy cookbook and I see the 
>>> principle but I'm not sure ow to extend it in my case.
>>>
>>> I've got some code which generates the error (cost) function as an 
>>> array of the same dimensions as raw_signals, but I can't see how to 
>>> use optimize.leastsq with that.
>>>
>>
>> I'm not sure if I understood what you're doing, but your error 
>> function must return an 1D array of residuals, no 2D (like raw_signals).
> 
> Sure, I'm working on that now!
> 
>> import numpy as nu
>> from scipy.optimize import leastsq
>>
>> # t is your time array
>> # x the parameter array for the current trace
>> # y = raw_signals[:,i] = the (i+1)th column
>>
>> # fit a trace
>> def model(t, x):
>>     A = x[0]
>>     B = x[1]
>>     C = x[2]
>>     return A * nu.exp(-t/B) + C
>>
>> def residuals(x, t, y):
>>     return y - model(t, x)
>>
>> x_sol = leastsq(residuals, x0, args = (t,y))
> 
> Right, this is the sort of thing I want to do, except I'd like to 
> simulateously fit all y[:] using the *same* C, i.e. globally fit them. 
> Hope that's clearer.
> 
> I'm messing about with scipy.reshape at the moment and sort of getting 
> somewhere. The residuals is now a 1D array, as is t and y. However, when 
> I use leastsq I get the following error:
> 
>   File "/sw/lib/python2.4/site-packages/scipy/optimize/minpack.py", line 
> 229, in leastsq
>     retval = 
> _minpack._lmdif(func,x0,args,full_output,ftol,xtol,gtol,maxfev,epsfcn,factor,diag) 
> 
> minpack.error: Result from function call is not a proper array of floats.
> 
> I'm obviously not quite getting this!!
> 
> Thanks for your help,
> 

Could you post an example code producing this error?

-- 
cheers,
steve

Random number generation is the art of producing pure gibberish as
quickly as possible.



More information about the SciPy-user mailing list