对于fn和gr,R optim具有相同的功能

时间:2014-04-24 15:13:45

标签: r optimization mathematical-optimization

我想使用optim()来优化成本函数(fn参数),我将提供一个渐变(gr参数)。我可以为fn和gr编写单独的函数。但是,它们有很多共同的代码,我不希望优化器浪费时间重复这些计算。那么有可能提供一个计算成本和梯度的函数吗?如果是这样,那么optim()的调用语法是什么?

例如,假设我想要最小化的函数是

cost <- function(x) {
    x*exp(x)
}

显然,这不是我试图最小化的功能。这里列出的内容太复杂了,但这个例子用来说明问题。现在,渐变将是

grad <- function(x) {
    (x+1)*exp(x)
}

正如您所看到的,这两个函数(如果单独调用)将重复一些工作(在本例中为指数函数)。但是,由于optim()接受两个单独的参数(fn和gr),看起来没有办法避免这种低效率,除非有办法定义像

这样的函数
costAndGrad <- function(x) {
    ex <- exp(x)
    list(cost=x*ex, grad=(x+1)*ex)
}

然后将该函数传递给optim(),这需要知道如何提取成本和梯度。

希望能解释这个问题。就像我说我的功能要复杂得多,但想法是一样的:有两个计算(成本和梯度)都有相当多的代码,我不想不必要地重复这些代码。

顺便说一下,我是R新手,所以可能会有一些我想念的简单!

非常感谢

1 个答案:

答案 0 :(得分:3)

nlm函数执行优化,并且它希望将梯度信息作为属性返回到作为原始函数值返回的值。这与您在上面显示的内容类似。请参阅nlm的帮助中的示例。