2016-08-22 32 views
4

假設我有一個優化問題來解決使用R,optimx。有什麼辦法可以隨時間提取參數和目標函數值嗎?是否有任何方法來提取R optimx中的每次迭代的參數和目標函數

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

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

的目標是努力讓這樣的情節:

enter image description here

我認爲我們可以手動梯度下降與下面的代碼做到這一點,但我我該怎麼辦它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) 

回答

5

創建一個副作用:

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

resulting plot

注意,這包括所有的函數調用,即使那些算法拒絕的結果,並且重試。 control = list(trace = TRUE, REPORT = 1)optimx打印接受的嘗試的函數值,您可以capture.output這並使用它從log只得到這些參數。

optimx更改爲返回所有接受的嘗試會更好,但我不打算投入這種努力。你可以問納什教授他是否願意這樣做,但如果你沒有引人注目的常見用例,他可能也不會。

+0

有趣的情節,真的對我很有幫助。這種方法存在一個問題,我們不知道如何分配'log'變量,因爲工具箱使用的迭代次數不確定嗎? – hxd1011

+0

我們可以做出合理的估計。如果估計值太小,請重試更大的估計值。迭代次數限制爲100次,因此即使對於大多數有問題的擬合,n = 1000也應該足夠。 – Roland

2

據我所知,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)有助於正確理解這些值(@Roland評論,謝謝!)。並使用this approachmethod="L-BFGS-B",可以獲得有關control=list(trace=6, REPORT=1)報告的值的其他信息。

enter image description here

+0

但當然這是一個不同的優化器,具有不同的中間結果。 – Roland

+0

@Roland;謝謝你的評論。我已編輯過。 – cuttlefish44

相關問題