从R获取optim函数的更多详细信息

从R获取optim函数的更多详细信息,r,artificial-intelligence,convex-optimization,R,Artificial Intelligence,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") f1您可以修改函数,将传递到函数中的值存储到全局列表中 i <- 0 vals &

我对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")

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

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")

i将
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
res1 4 0.480000
#参数0.60000-0.20000
#i>26 0.031667
# ......
#*i>13 34 0.000000
#参数-0.000000.00000
# 14 34 0.000000
#参数-0.000000.00000
#退出共轭梯度极小值
#使用了34项功能评估
#使用了15个梯度评估

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

如果您只需要函数求值的数量,请参阅结果的
$counts
元素:

 counts: A two-element integer vector giving the number of calls to
          ‘fn’ and ‘gr’ respectively. This excludes those calls needed
          to compute the Hessian, if requested, and any calls to ‘fn’
          to compute a finite-difference approximation to the gradient.

对于部分解决方案,您需要@Dason的解决方案或类似的解决方案。

函数编程中的一个很好的练习是编写一个函数,该函数将函数作为参数,并返回一个与该参数函数相同的函数,但会记录到全局函数。然后,您可以将日志添加到传递给optim的任何函数中,方法是包装它,而不是更改它!拥有所有这些可能性真是太好了,但我认为这是最适合我的情况。非常感谢,伙计们+1,但我想知道
计数
和实际迭代次数之间的关系。假设我设置了最大迭代次数
maxit=10
,但我可以将
fn的
计数设置为20。我们该怎么解释呢?(嗯,我想我已经评论过了,但也许它丢了)。取决于方法和细节:例如,Nelder Mead可以根据局部几何结构在每次迭代中进行不同数量的函数求值(我认为是2-3次)。e、 g.尝试
示例(“optim”);optim(c(-1.2,1),fr,method=“Nelder-Mead”,control=list(trace=100))