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