从R的optim函数获取更多细节

gco*_*cci 4 artificial-intelligence r convex-optimization

我对optim函数不是很熟悉,我想从结果中得到这些信息:a)实现结果需要多少次迭代?和b)绘制部分解的序列,即在每次迭代结束时获得的解.

我的代码到现在看起来像这样:

  f1 <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  x1^2 + 3*x2^2
}

res <- optim(c(1,1), f1, method="CG")
Run Code Online (Sandbox Code Playgroud)

如何改进它以获得更多信息?

提前致谢

Das*_*son 5

您可以修改函数以将传递给它的值存储到全局列表中.

i <- 0  
vals <- list()
f1 <- function(x) {
  i <<- i+1
  vals[[i]] <<- x

  x1 <- x[1]
  x2 <- x[2]
  x1^2 + 3*x2^2  
}

res <- optim(c(1,1), f1, method="CG")
Run Code Online (Sandbox Code Playgroud)

现在如果你在运行函数后检查i和vals,你可以看到发生了什么.如果要在optim运行时查看值,也可以在函数中抛出print语句.

  • 函数式编程的一个很好的练习是编写一个函数,该函数将函数作为参数并返回一个与该参数函数相同的函数,但是记录到全局函数.然后,您可以通过包装而不是更改它来将日志记录添加到传递给optim的任何函数! (2认同)

sie*_*ste 5

传递trace=1作为控制参数,optim为您提供有关优化进度的更多详细信息:

res <- optim(c(1,1), f1, method="CG", control=list(trace=1))
# Conjugate gradients function minimizer
# Method: Fletcher Reeves
# tolerance used in gradient test=3.63798e-12
# 0 1 4.000000
# parameters    1.00000    1.00000 
# * i> 1 4 0.480000
# parameters    0.60000   -0.20000 
#   i> 2 6 0.031667
# ......
# * i> 13 34 0.000000
# parameters   -0.00000    0.00000 
# 14 34 0.000000
# parameters   -0.00000    0.00000 
# Exiting from conjugate gradients minimizer
#   34 function evaluations used
#   15 gradient evaluations used
Run Code Online (Sandbox Code Playgroud)

但是,似乎信息只写入标准输出,因此您必须使用sink将输出传递给文本文件,然后进行一些编辑以获取绘图的参数值.