【问题标题】:R optim same function for fn and grR 优化 fn 和 gr 的相同功能
【发布时间】:2014-06-09 23:26:52
【问题描述】:

我想使用 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 新手,所以我可能缺少一些简单的东西!

非常感谢

【问题讨论】:

  • 我认为闭包的概念在这里可能有用(adv-r.had.co.nz/…)。就您而言,我没有足够的信息来提供比这更具体的答复。

标签: r optimization mathematical-optimization


【解决方案1】:

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

【讨论】:

  • 谢谢,我会试一试。唯一的问题是 nlm 将我限制在牛顿算法中,而 optim 提供了许多不同的选择。
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2018-08-01
相关资源
最近更新 更多