假设我有一个优化问题要使用R
,optimx
解决。有什么方法可以随时间提取参数和目标函数值?
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
以返回所有已接受的尝试,但是我不会投入这种努力。您可以问纳什教授是否愿意这样做,但是如果您没有引人注目的通用用例,他可能也不会这样做。