在R optimx中,是否有任何方法可以为每次迭代提取参数和目标函数

在R optimx中,是否有任何方法可以为每次迭代提取参数和目标函数,r,mathematical-optimization,R,Mathematical Optimization,假设我有一个优化问题要用R,optimx来解决。是否有任何方法可以随时间提取参数和目标函数值 f<-function(x){ return(sum(abs(x))) } gr<-function(x){ return(sign(x)) } opt=optimx::optimx(runif(2),f,gr,method="BFGS") 产生副作用: f<-function(x){ .GlobalEnv$i <- get("i", envir = .Globa

假设我有一个优化问题要用
R
optimx
来解决。是否有任何方法可以随时间提取参数和目标函数值

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

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

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

据我所知,
method=“L-BFGS-B”
可以制作参数的进度报告。但是结果没有报告,所以我保留了消息并提取了值

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)])
库(optimx);图书馆(dplyr)
cap%as.numeric()%%>%矩阵(ncol=2,byrow=T)
绘图(-2:2,-2:2,type=“n”,ann=F)
对于(c(1,2,4)中的i)多边形(c(-0.5,0,0.5,0,-0.5)*i,c(0,0.5,0,-0.5,0)*i)
点(d,pch=字母[1:nrow(d)])
[编辑]
正如帮助所说,源代码()有助于准确理解这些值(@Roland commented,谢谢!!)。使用
method=“L-BFGS-B”
,您可以获得有关哪些值
control=list(trace=6,REPORT=1)
报告的其他信息


当然,这是一个不同的优化器,具有不同的中间结果。有趣的绘图,对我很有帮助。这种方法的一个问题是,我们不知道如何分配
log
变量,因为工具箱使用的迭代次数不确定,对吗?我们可以做出合理的估计。如果估计值太小,请使用更大的估计值重试。迭代次数限制为100次,因此即使对于大多数有问题的拟合,n=1000也应该足够了。
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)])