假设我有一个优化问题要使用Roptimx解决。有什么方法可以随时间提取参数和目标函数值?

f<-function(x){
  return(sum(abs(x)))
}

gr<-function(x){
  return(sign(x))
}
opt=optimx::optimx(runif(2),f,gr,method="BFGS")


目标是尝试绘制这样的图:

r - 有没有办法为R optimx中的每次迭代提取参数和目标函数-LMLPHP

我认为我们可以使用以下代码通过Gradient Decent手动完成此操作,但是如何在optimx中执行此操作?

x=c(0.5,1.5)
alpha=0.1
max_iter=20
x_trace=matrix(rep(0,max_iter*2),ncol=2)

for (i in 1:max_iter){
  x=x-alpha*gr(x)
  x_trace[i,]=x
}
f_trace=apply(x_trace,1,f)

最佳答案

产生副作用:

f<-function(x){
  .GlobalEnv$i <- get("i", envir = .GlobalEnv) + 1
  .GlobalEnv$log[get("i", envir = .GlobalEnv),] <- x
  return(sum(abs(x)))
}

gr<-function(x){
  return(sign(x))
}

library(optimx)
i <- 0
log <- matrix(numeric(100 * 2), ncol = 2)

opt <- optimx(c(0.8, -0.9),f,gr,method="BFGS")
log <- log[seq_len(i), ]

plot(log, type = "l", xlim = c(-2, 2), ylim = c(-1.2, 1.2))


r - 有没有办法为R optimx中的每次迭代提取参数和目标函数-LMLPHP

请注意,这包括所有函数调用,甚至包括那些算法拒绝结果并重试的函数调用。 control = list(trace = TRUE, REPORT = 1)允许optimx打印接受的尝试的函数值,您可以capture.output并使用它从log中仅获取这些参数的参数。

最好更改optimx以返回所有已接受的尝试,但是我不会投入这种努力。您可以问纳什教授是否愿意这样做,但是如果您没有引人注目的通用用例,他可能也不会这样做。

10-06 13:50