[R] Problem with optim (method L-BFGS-B)

Ben Bolker ben at zoo.ufl.edu
Thu Nov 8 17:39:06 CET 2001


  A few general suggestions:

 1. you should always check the $convergence of your result -- in this
case it tells you that the optimization failed, and tells you something
about why (although admittedly not much you could interpret without
looking at the source code).
 2.  control(fnscale=-1,trace=4) gives you some details of the progress of
the optimization.
 3.  I would probably never start a box-constrained algorithm on the
boundaries of the allowable region -- that's just making things hard for
yourself ...
  4.  nonlinear optimizers are notoriously finicky.  I found that, even
starting from the same place, changing fnscale from -1 to -1e-12 (so that
the values given by the function are around 1.0) allowed me to get to the
right answer.  Whenever possible, too, providing analytical derivatives
for the function will make the algorithms much faster and more stable.  If
you're going to do a lot of this it's worthwhile -- particularly as it
looks pretty easy for your functions, if this one is at all typical.

  Ben Bolker


On Thu, 8 Nov 2001, Isabelle ZABALZA wrote:

> Hello,
>
> I've just a little problem using the function optim.
> Here is the function I want to optimize :
>
> test_function(x){(exp(-0.06751 + 0.25473*((x[1]-350)/150) +
> 0.04455*((x[2]-40)/20) + 0.09399*((x[3]-400)/100) -
> 0.17238*((x[4]-250)/50)-
> 0.45984*((x[5]-550)/150)-0.39508*((x[1]-350)/150)* ((x[1]-350)/150) -
> 0.05116*((x[2]-40)/20)* ((x[2]-40)/20) -
> 0.27735*((x[3]-400)/100)*((x[3]-400)/100) - 0.12902*((x[4]-250)/50)*
> ((x[4]-250)/50)-1.07812*((x[5]-550)/150)* ((x[5]-550)/150) -
> 0.14650*((x[1]-350)/150)*((x[2]-40)/20) - 0.39647*((x[1]-350)/150)*
> ((x[3]-400)/100) + 0.09800*((x[1]-350)/150)* ((x[4]-250)/50) +
> 1.01607*((x[1]-350)/150)*((x[5]-550)/150) -0.04202*((x[2]-40)/20)*
> ((x[3]-400)/100) + 0.05057*((x[2]-40)/20)* ((x[4]-250)/50) +
> 0.17933*((x[2]-40)/20)*((x[5]-550)/150) + 0.10944*((x[3]-400)/100)*
> ((x[4]-250)/50) + 0.62105*((x[3]-400)/100)* ((x[5]-550)/150) -
> 0.22426*((x[4]-250)/50)*((x[5]-550)/150))/219741978624 )}
>
> Then I run the following command, and I get a pretty good result (I know
> approximatively the theoritical maximum)
>
>  optim(c(200,60,500,300,700),test,control=list(fnscale=-1))$par
> [1] 398.17520  31.34863 372.17182 217.30874 533.49458
>
> Fortunately, all the optimal values fall in their range of possible
> value. But to be rigourous, I should perform a box-constrained
> optimization.
> Then, I do so with the following command  (in fixing the lower and upper
> args and not):
>
>  optim(c(200,60,500,300,700),test,control=list(fnscale=-1),method="L-BFGS-B",lower=c(200,20,300,200,400),upper=c(500,60,500,300,700))$par
>
> [1] 200  60 500 300 700
>
>  optim(c(200,60,500,300,700),test,control=list(fnscale=-1),method="L-BFGS-B")$par
>
> [1] 200.00000  60.00007 500.00000 300.00000 700.00000
>
> Here the result I get is wrong, and in fact it is more or less the
> initial guess I 've set.
>
> Can someone explain me what is going wrong with the method "L-BFGS-B"
>
> Thanks in advance
>
> Isabelle Zabalza-Mezghani
>
>
>
> --
> Isabelle Zabalza-Mezghani          Tel : 01 47 52 61 99
> Institut Français du Pétrole       E-mail : isabelle.zabalza-mezghani at ifp.fr
> 1-4 Av. Bois Preau - Bat Lauriers
> 92852 Rueil Malmaison Cedex, France
>
>
>

-- 
318 Carr Hall                                bolker at zoo.ufl.edu
Zoology Department, University of Florida    http://www.zoo.ufl.edu/bolker
Box 118525                                   (ph)  352-392-5697
Gainesville, FL 32611-8525                   (fax) 352-392-3704

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list