有什么方法可以为 R optimx 中的每次迭代提取参数和 objective 函数

Is there any way to extract parameters and objective function for each iteration in R optimx

假设我有一个优化问题需要使用 Roptimx 来解决。有什么方法可以随着时间的推移提取参数和 objective 函数值吗?

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

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

目的是想拍这样的剧情:

我认为我们可以使用以下代码使用 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))

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

获取这些参数

最好将optimx更改为return所有接受的尝试,但我不会投入那种努力。你可以问 Nash 教授他是否愿意这样做,但如果你没有令人信服的常见用例,他可能也不会。

据我所知,method="L-BFGS-B"可以做一个params的进度报告。但是结果没有报告,所以我保留了消息并提取了值。

library(optimx); library(dplyr)

cap <- capture.output(optimx(runif(2), f, gr, method="L-BFGS-B", 
                             control=list(trace=6, REPORT=1)))
temp <- cap[grep("X =|X0 =", cap)]
d <- gsub("X0 = |X = |Cauchy X =  ", "", temp) %>% strsplit(" ") %>% 
  unlist() %>% as.numeric() %>% matrix(ncol=2, byrow=T)

plot(-2:2,-2:2, type="n", ann=F)
for(i in c(1,2,4)) polygon(c(-0.5,0,0.5,0, -0.5)*i, c(0, 0.5, 0, -0.5, 0)*i)
points(d, pch=letters[1:nrow(d)])

[已编辑]
如帮助所述,源代码(opt/lbfgs_bcm.shar) helps to exactly understand these values (@Roland commented, thanks !!). And using this approachmethod="L-BFGS-B",您可以获得有关值 control=list(trace=6, REPORT=1) 报告的更多信息。