我想使用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新手,所以可能会有一些我想念的简单!
非常感谢
答案 0 :(得分:3)
nlm
函数执行优化,并且它希望将梯度信息作为属性返回到作为原始函数值返回的值。这与您在上面显示的内容类似。请参阅nlm
的帮助中的示例。