[SciPy-Dev] [PATCH] proper broadcasting for epsilon in scipy.optimize.approx_fprime()
Wed Sep 14 12:29:36 CDT 2011
Hi SciPy developers!
Many of the functions in scipy.optimize module (e.g. fmin_bfgs) accept
the 'epsilon' parameter, which is meant to be the step size coefficient.
For multidimensional optimization one may want to set different values
of the coefficient for different dimensions. But, at least in 0.8, the
fmin_bfgs function, contrary to what its docs say, can't handle vectors
as epsilon argument, only scalars work.
The patch which I'm submitting uses Numpy broadcasting for the purpose
of accepting both scalars AND vectors of appropriate size as the epsilon
It may not apply clearly in trunk, as was developed (or, rather, quickly
hacked around) for 0.8. Please rebase if needed.
--- optimize.py 2010-07-26 17:48:33.000000000 +0300
+++ optimize.py 2011-09-14 19:49:11.040484658 +0300
@@ -617,8 +617,9 @@
grad = numpy.zeros((len(xk),), float)
ei = numpy.zeros((len(xk),), float)
for k in range(len(xk)):
- ei[k] = epsilon
- grad[k] = (f(*((xk+ei,)+args)) - f0)/epsilon
+ ei[k] = 1.0
+ d = epsilon * ei
+ grad[k] = (f(*((xk+d,)+args)) - f0)/d[k]
ei[k] = 0.0
More information about the SciPy-Dev