[SciPy-user] Cannot get optimize.fmin_bfgs to work
josef.pktd at gmail.com
josef.pktd at gmail.com
Tue Mar 3 06:48:24 EST 2009
On Tue, Mar 3, 2009 at 4:15 AM, Williamson, Ross
<Ross.Williamson at usap.gov> wrote:
> Hi All
>
> I'm trying to get optimize.fmin_bfgs to work with no luck - I have an x,y array of numbers (about 100) to which I'm trying to fit a curve to. Both the auto fprime calculator and my own Jacbian do not work:
>
> ValueError: setting an array element with a sequence.
>
> I'm presuming I'm doing something really silly but I cannot find a simple example on the web (The one using the Rosenbrock function does not help).
>
> The reason for doing this is that I want to progress to the bounded version of this function as leastsq works (but does not allow for bounded data).
>
> Please find code below:
>
> from numpy import zeros
> from scipy import optimize
> def fitfunc(p, x):
>
> a_white = p[0]
> a_pink = p[1]
> a_red = p[2]
> a_phot = p[3]
> fk = p[4] # photon_noise roll-off ~ 11.4 Hz mean 2008 season
> alpha2 = p[5]
>
> #result = wlevel*(1.+(f_knee/x)^alpha)
> result = a_white + a_pink * x ** (-1.0) + a_red * x ** (-1.0 * alpha2) + a_phot / (1. + x ** 2 / fk ** 2)
>
> return result
>
> def fitgrad(p,x,y,err):
> #Calculate Jacobian
> J = zeros(len(p),float)
> J[0] = 1.0
> J[1] = 1.0/x
> J[2] = x ** (-1.0 * alpha2)
> J[3] = 1.0/(1. + x ** 2 / fk ** 2)
> J[4] = (2 * a_phot * x**2)/(fk**3 * ((x**2/a_phot**2) + 1)**2)
> J[5] = a_red * x **(-1.0* alpha2) * log(x)
>
> return J
>
> def errorfunc(p,x,y,err):
> err_r = (y-fitfunc(p,x))/err
> print err_r
> return err_r
>
> def test(x,y,noise):
>
> pinit = [0.00125645, 0.00062822510, 0.00062822510,0.00062822510, 11.0, 2.0]
>
> out = optimize.leastsq(errorfunc,pinit,args=(x,y,noise), full_output=1)
> out2 = optimize.fmin_bfgs(errorfunc,pinit,fprime=fitgrad,args=(x,y,noise))
fmin_bfgs and other optimization functions expect errorfunc to be the
objective function, which returns a single value
e.g. define func = np.sum(errorfunc**2)
and then try optimize.fmin_bfgs(func,pinit,fprime=fitgrad,args=(x,y,noise))
this is different from leastsq, where taking the square and summing is
done inside of leastsq
Josef
> print out[0]
> print out[1]
>
> return out
>
> _______________________________________________
> SciPy-user mailing list
> SciPy-user at scipy.org
> http://projects.scipy.org/mailman/listinfo/scipy-user
>
More information about the SciPy-User
mailing list