有什么方法可以为 R optimx 中的每次迭代提取参数和 objective 函数
Is there any way to extract parameters and objective function for each iteration in R optimx
假设我有一个优化问题需要使用 R
、optimx
来解决。有什么方法可以随着时间的推移提取参数和 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 approach 和 method="L-BFGS-B"
,您可以获得有关值 control=list(trace=6, REPORT=1)
报告的更多信息。
假设我有一个优化问题需要使用 R
、optimx
来解决。有什么方法可以随着时间的推移提取参数和 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 approach 和 method="L-BFGS-B"
,您可以获得有关值 control=list(trace=6, REPORT=1)
报告的更多信息。