[SciPy-user] Another leastsq Jacobian bug
Lin Shao
shao at msg.ucsf.edu
Mon Jun 25 00:43:02 EDT 2007
Try this:
import numpy as N
import scipy.optimize as O
## Create my data to fit:
x=N.arange(-10,10,dtype=N.float32)
y=(x-1.234)**2+3.456
## I want to fit y=p0*(x-p1)^2+p2
## Now I define my objective
def obj_func(params, xx, yy, mode='col'):
return params[0] * (xx-params[1])**2 + params[2] - yy
## 'mode' is dummy here, because I want to use it for my Jocobian
## Now define my Jacobian
def Jacobian(params,xx,yy,mode='col'):
J = N.empty((len(params),xx.size))
J[0] = (xx-params[1])**2
J[1] = -2*params[0]*(xx-params[1])
J[2] = 1
if mode=='col':
return J
elif mode=='row:
return J.transpose()
else:
raise ValueError, "Unkown mode %s in Jacobian()" % mode
## Hopefully I did my calculus correctly
## First, try without Jocobian given
b=O.leastsq(obj_func, (1.,1.,2.), args=(x, y, 'col'))
print b[0]
## the result is [ 1. 1. 2.]
## obviously a failure, but no warning is returned
## Second, try Jacobian with col_deriv=1
b=O.leastsq(obj_func, (1.,1.,2.), args=(x, y, 'col'), Dfun=Jacobian,
full_output=1, col_deriv=1)
## full_output has to be 1 because of a seg fault bug I reported earlier
print b[0]
## the result is [ 1.00000004 1.23400008 3.45599962]
## Good Job!
## Last, try Jacobian with col_deriv=0
b=O.leastsq(obj_func, (1.,1.,2.), args=(x, y, 'row'), Dfun=Jacobian,
full_output=1, col_deriv=0)
print b[0]
## the result is [ 1.02507777 1.222815 2.2651552 ]
## completely different result and wrong
Sorry it wasn't true what I said in my first report. The leastsq()
result when col_deriv is not 1 is not an exactly the same as the
initial guess. But one does have to agree there's a bug somewhere.
--lin
On 6/23/07, Stefan van der Walt <stefan at sun.ac.za> wrote:
> Hi Lin
>
> On Fri, Jun 22, 2007 at 07:35:05PM -0700, Lin Shao wrote:
> > It seems like when calling leastsq(), if the Jacobian matrix is
> > organized as rows of partial derivatives (w.r.t. each variable), then
> > no optimization is done at all -- the return value is the same as the
> > initial guess. It only works when the matrix is columns of derivatives
> > and set the parameter col_deriv to 1.
>
> It would be helpful if you could provide two short snippets of code to
> illustrate the problems you mention.
>
> Regards
> Stéfan
> _______________________________________________
> 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