2016-08-22 2 views
4

Angenommen, ich habe ein Optimierungsproblem zu lösen mit R, optimx. Gibt es eine Möglichkeit, die Parameter und Zielfunktionswerte im Laufe der Zeit zu extrahieren?Gibt es eine Möglichkeit zum Extrahieren von Parametern und Zielfunktion für jede Iteration in R optimx

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

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

Das Ziel versucht, eine solche Handlung zu machen:

enter image description here

Ich denke, wir es manuell mit folgenden Code mit Gradientenverfahren tun können, aber, wie ich kann ich es tun in 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) 

Antwort

5

erstellen Nebeneffekt:

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

Beachten Sie, dass diese alle Funktionsaufrufe enthalten, auch solche, bei denen der Algorithmus das Ergebnis und Wiederholungen ablehnt. control = list(trace = TRUE, REPORT = 1) können optimx die Funktionswerte für akzeptierte Versuche drucken, und Sie könnten capture.output dies und verwenden Sie es, um nur die Parameter dieser von log zu erhalten.

Es wäre besser, optimx zu ändern, um alle akzeptierten Versuche zurückzugeben, aber ich werde nicht diese Art von Aufwand investieren. Du könntest Prof. Nash fragen, ob er dazu bereit wäre, aber wenn du keinen zwingenden allgemeinen Anwendungsfall hast, wird er wahrscheinlich auch nicht gehen.

+0

Interessante Handlung und wirklich hilfreich für mich. Ein Problem mit diesem Ansatz, wir wissen nicht, wie man "log" Variable zuweisen, weil die Anzahl der Iterationen von Toolbox nicht sicher ist, richtig? – hxd1011

+0

Wir können eine angemessene Schätzung machen. Wenn die Schätzung zu klein war, versuchen Sie es mit einer größeren Schätzung. Die Anzahl der Iterationen ist auf 100 begrenzt, also sollte etwas wie n = 1000 selbst für die meisten problematischen Anpassungen ausreichen. – Roland

2

Soweit ich weiß, kann method="L-BFGS-B" einen Fortschrittsbericht von Params machen. Aber das Ergebnis hat den Bericht nicht, also behielt ich die Nachricht und extrahierte den Wert.

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

[editiert]
Als Hilfe sagt, Quellcode (opt/lbfgs_bcm.shar) hilft dabei, genau diese Werte zu verstehen (@Roland kommentiert, Dank !!). Und mit this approach mit method="L-BFGS-B" können Sie zusätzliche Informationen darüber erhalten, welche Werte control=list(trace=6, REPORT=1) meldet.

enter image description here

+0

Aber natürlich ist dies ein anderer Optimierer mit unterschiedlichen Zwischenergebnissen. – Roland

+0

@Roland; Vielen Dank für Ihren Kommentar. Ich habe bearbeitet. – cuttlefish44

Verwandte Themen