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