我正在使用R编程语言。
我定义了以下功能:
f1 <- function(x) {
i <<- i+1
vals[[i]] <<- x
final_value = x[1]^2 + x[2]^2
}
然后优化了这个功能:
i <- 0
vals <- list()
res <- optim(c(1,1), f1, method="CG")
我正试图理解";optim";(https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/optim)功能:
$par
[1] -4.103643e-07 -4.103643e-07
$value
[1] 3.367978e-13
$counts
function gradient
26 11
$convergence
[1] 0
$message
NULL
特别是,我试图理解;计数";论点。阅读文件,给出以下解释:
计数:一个两元素的整数向量,分别给出对fn和gr的调用次数。这排除了计算Hessian所需的调用(如果请求(,以及计算梯度的有限差分近似值所需的对fn的任何调用
我本以为";计数";将指函数优化所需的迭代次数。但当我看迭代次数时,迭代的总次数与"0"的输出不匹配;计数":
> vals
[[1]]
[1] 1 1
[[2]]
[1] 1.001 1.000
[[3]]
[1] 0.999 1.000
[[4]]
[1] 1.000 1.001
....
[[68]]
[1] -1.000410e-03 -4.103643e-07
[[69]]
[1] -4.103643e-07 9.995896e-04
[[70]]
[1] -4.103643e-07 -1.000410e-03
例如,似乎使用了70次迭代来优化该函数;计数";论证表明使用了26次迭代。
有人能帮我理解什么吗;计数";在这个问题中,70和26之间有什么区别
谢谢!
正如文档所述,函数optims
不计算所有函数调用。如果函数被调用,例如计算Hessian导数,或者近似步骤,vals
将获得更多的值,但res$counts[["function"]]
不会,因此与函数调用的总数(70(相比,该值较小(26(。您想要优化的函数非常简单,因此不需要太多迭代,大多数调用(70-26(只是管理开销。差异越大,花在主要部分(实际优化(上的时间就越少。