[R] optim
Duncan Murdoch
murdoch at stats.uwo.ca
Thu Aug 4 12:22:46 CEST 2005
nwew wrote:
> Dear R-helpers,
>
> The function optim implements algorithms that I would like to use.
>
>
> I have function implemented in R, which given the parameters of which
> minimization is to take place returns a scalar as well as the gradient.
>
> Unfortunately optim requires two function _fn_ and _gr_ where fn returns the
> function value and gr the gradient. Splitting my function in two functions
> would be easy, however I am wondering if evaluating both is not doubling the
> the very high computational costs. Most of the computational intensive
> operations are identical if computing the function value and gradient.
>
> Question: is there a way to tweek optim that only one function evaluation is
> necessary? Are ther other implementations of the algorithm, which do assume
> that the function to be minimized returns the function value and the gradient
> as well?
I don't know the answer to your question, but here's a different
approach. Write a function that effectively splits your single function
into two:
splitfn <- function(f) {
lastx <- NA
lastfn <- NA
lastgr <- NA
doeval <- function(x) {
if (identical(all.equal(x, lastx), TRUE)) return(lastfn)
lastx <<- x
both <- f(x)
lastfn <<- both$fnval
lastgr <<- both$grval
return(lastfn)
}
fn <- function(x) doeval(x)
gr <- function(x) {
doeval()
lastgr
}
list(fn=fn, gr=gr)
}
I haven't tested this, but the idea is that it sets up a local
environment where the last x value and last function and gradient values
are stored. If the next call asks for the same x, then the cached
values are returned. I don't know if it will actually improve
efficiency: that depends on whether optim evaluates the gradient and
function values at the same points or at different points.
You would use this as follows, assuming your function is called f:
f2 <- splitfn(f)
optim(par, f2$fn, f2$gr, ...)
Duncan Murdoch
More information about the R-help
mailing list