【问题标题】:Number of iterations with the optim and optimx function in RR 中 optim 和 optimx 函数的迭代次数
【发布时间】:2018-01-24 19:21:19
【问题描述】:

为了最小化关于 2 个参数的函数,我在 R 中使用 optim 或 optimx 函数,两者都使用 Nelder-Mead 方法。我将 optim 和 optimx 函数的 itnmax 和 maxit 分别固定为 1,但这需要我很多时间来解决它。 itnmax=1 或 maxit=1 真的意味着 1 个迭代步骤吗?因为如果是的话,就不会花那么多时间了。

这是带有 f 函数的 optim 函数来最小化。评估函数大约需要 10 秒。我在 10 分钟后停止了优化,因为它还没有完成。

parmin=optimx(c(3,0.04),fn=f,method="Nelder-Mead",itnmax=1)

【问题讨论】:

  • 我的功能介绍太长了,比较复杂。我只是问 itnmax 真正代表什么,在我的情况下它是否应该更快,因为我知道我的函数需要大约 10 秒来评估。
  • 那么,多长时间是多少?在 d 维中的一步需要 d+2 = 4 次函数评估。是否需要超过 40 秒?
  • 看我的问题,我补充了一些信息。需要10多分钟。
  • 我赞成,因为这是一个有用的问题,但为了将来参考,我认为您可以提供一个可重复的示例(例如,请参阅我的答案......)

标签: r optimization


【解决方案1】:

带有评估计数器、强制延迟(我将其设置为 1 秒)和跟踪输出的测试功能(针对我们中间的不耐烦的人)

eval_count <- 0
f <- function(x) { 
     cat(".")
     eval_count <<- eval_count + 1
     Sys.sleep(1) 
     return(sum(x^2) )
}

parmin=optimx(c(3,0.04),fn=f,method="Nelder-Mead",itnmax=1)
eval_count ## 52

因此,在每次评估约 10 秒时,我预计您的函数需要大约 520 秒(但可能会更长,具体取决于详细信息 - 见下文)。

那么这里发生了什么?主要问题是optimx 正在通过一种昂贵的方法(Richardson 外推法:参见?numDeriv::grad)计算 Hessian,以便进行更严格的收敛测试。它还在启动时进行一些测试。 ?optimx 说(控制参数详情下):

如果我们不想测试 Kuhn、Karush、Tucker 最优条件,kkt =FALSE。默认值为真。但是,因为 Hessian 的计算可能很慢……

如果您的目标函数远不是二次的,Richardson 外推法可能会稍微昂贵一些(需要更多的函数调用),这可以解释 8.7 分钟 (=52*10/60) 和 10 分钟之间的差异。或者,如果您的函数需要 12 秒而不是 10 秒,那么 52 次函数评估的期望值也会超过 10 分钟。

eval_count <- 0
parmin=optimx(c(3,0.04),fn=f,method="Nelder-Mead",itnmax=1,
      control=list(starttests=FALSE,kkt=FALSE))
eval_count ## 5

【讨论】:

  • 好吧,我认为 Nelder-Mead 方法不计算 Hessian,这就是使该方法相当快的原因。 Nelder-Mead 方法在 optim 包中的作用是否相同?
猜你喜欢
  • 1970-01-01
  • 2013-12-21
  • 2011-04-15
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多