[SciPy-user] Using SciPy/NumPy optimization
Brandon Nuttall
bnuttall at uky.edu
Wed Feb 28 10:56:04 EST 2007
Folks,
I've gotten further, but still am not there. I have the following code:
import numpy as np
from scipy.optimize import fmin_tnc
class hyp_func:
def __init__(self,*args):
self.x, self.y = args
self.avg = y.mean()
def rmsd(self,*args):
"""A function suitable for passing to the fmin() minimizers
"""
a, b, c = args[0]
sse = 0.0
sst = 0.0
# minimize the RMSD
for i in range(len(x)):
y = a*(1.0+b*c*x[i])**(-1.0/b)
sse += (self.y[i]-y)**2
sst += (self.avg-y)**2
# this won't work because I don't know what x should be or if it
is related
diff = [0.0,0.0] # this is just an initial value and won't get any
results
# diff[0] = (-a*c-a*c*c*b*?????)**((-1-b)/b)
# diff[1] = ((-1-b)/b)*(-a*c*c*b)*(-a*c-a*c*c*b*?????)**(((-1-b)/b)-1)
return (sse / sst, diff)
# fake data for testing
a, b, c = [1.25,0.75,0.25]
x = []
y = []
for i in range(1,61):
x.append(float(i))
y.append(a*(1.0+b*c*float(i))**(-1.0/b))
x = np.array(x)
y = np.array(y)
myfunc=hyp_func(x,y)
params0 = [1.0,0.5,0.5]
retcode, nfeval, optimal = fmin_tnc(myfunc.rmsd,params0,
bounds=[(None,None),(0.001,5.0),
(-1.0,1.0)])
myfunc.rmsd() now returns the root mean square deviation which is to be
minimized. However, in looking at the example code in
scipy/optimize/tnc.py, I find that myfunc.rmsd() needs to return a second
argument, g, the gradient of the function. It looks like this needs to be
the first and second derivative of my function which if my [really, really]
rusty calculus should be:
y' = (-a*c-a*c*c*b*x)**((-1-b)/b)
y'' = ((-1-b)/b)*(-a*c*c*b)*(-a*c-a*c*c*b*x)**(((-1-b)/b)-1)
I'm not sure these derivatives are particularly informative about which way
to go to minimize the RMSD. At the moment, the code fails with a
SystemError (error return without exception set) in the call to
moduleTNC.minimize(). So, any suggestions on my next step?
FWIW: In tnc.py, in test(), the call to fmin_tnc() has a typo in the
keyword arguments. "maxnfeval=" should be "maxfun=". When running tnc.py to
execute the tests, example() and test1fg() run. The test2fg() detects an
infeasible condition (apparently, I guess that is what was to be tested);
Python raises an exception and terminates without running the other tests.
Brandon C. Nuttall
BNUTTALL at UKY.EDU Kentucky Geological Survey
(859) 257-5500 University of Kentucky
(859) 257-1147 (fax) 228 Mining & Mineral
Resources Bldg
http://www.uky.edu/KGS/home.htm Lexington, Kentucky 40506-0107
More information about the SciPy-User
mailing list