R中使用optim和optimx函数的迭代次数

时间:2017-08-16 15:03:36

标签: r optimization

为了最小化关于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)

1 个答案:

答案 0 :(得分: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通过一种昂贵的方法计算Hessian(Richardson外推:见?numDeriv::grad)以便进行更严格的收敛测试。它还在启动时进行了一些测试。 ?optimx说(根据控制参数的详细信息):

  

kkt = FALSE如果我们不想测试Kuhn,Karush,Tucker最优性条件。默认值为TRUE。但是,因为Hessian计算可能非常慢......

如果你的目标函数远非二次方,那么Richardson推断可能会更加昂贵(需要更多的函数调用),这可以解释8.7分钟(= 52 * 10/60)和10分钟之间的差异。或者,如果你的函数需要12秒而不是10秒,那么这也会带来期望&gt; 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