2016-04-01 4 views
0

Für Optimierungen, die lange dauern (zig Minuten, Stunden, Tage oder Monate), ist es notwendig, eine Optimierung erneut zu starten, indem die Optimierungshistorie im Falle eines Programmfehlers oder eines Stromausfalls verwendet wird, aber fmin Algorithmus (und einige andere) liefern die Historie nicht als Ausgabe oder als Eingabe. Wie können Sie die Ergebnisse der Optimierungshistorie von fmin speichern und verwenden, um sicherzustellen, dass Ihre gesamte rechnerische Investition nicht verloren geht?Wie stoppen Sie die Funktion scipy.optimize.fmin und starten sie erneut mit dem Optimierungsverlauf?

Ich hatte diese Frage gestern Morgen und konnte die Antwort nirgendwo online finden, also habe ich meine eigene Lösung zusammengestellt. Siehe unten.

Antwort

1

Die Antworten auf die Echtzeitüberwachung, die Protokollaufzeichnung und die Wiederaufnahme von fmin führen dazu, dass die aufrufbare Funktion verwendet wird, um die Funktionseingänge und -ausgänge in einer Nachschlagetabelle zu speichern. Hier ist, wie es gemacht wird:

import numpy as np 
import scipy as sp 
import scipy.optimize 

die Geschichte zu speichern, erstellen Sie eine globale Geschichte Vektor für die Eingänge und ein globale Geschichte Vektor für die objektiven Funktionswerte der Eingänge gegeben. Ich initialisiert den anfänglichen Eingangsvektor auch hier:

x0 = np.array([1.05,0.95]) 
x_history = np.array([[1e8,1e8]]) 
fx_history = np.array([[1e8]]) 

I Rosenbrock- hier Funktion bin zu optimieren, da es die typische optimzation Algorithmus ist:

def rosen(x): 
    """The Rosenbrock function""" 
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0) 

einen Wrapper erstellen für die Funktion, die Sie zu optimieren und schreiben die globalen Variablen, wenn neue Eingaben von der Optimierungsfunktion angefordert werden und der Zielfunktionswert berechnet wird. Suchen Sie für jede Iteration den Verlauf, um zu ermitteln, ob der Zielfunktionswert für den angeforderten Vektor zuvor berechnet wurde, und verwenden Sie den zuvor berechneten Wert, falls dies der Fall war. Um einen Stromausfall zu "simulieren", habe ich eine Variable namens powerFailure erstellt, um die Optimierung zu beenden, bevor sie abgeschlossen ist. Ich habe powerFailure dann ausgeschaltet, um die Optimierung zu sehen.

def f(x): 
    global firstPoint, iteration, x_history, fx_history 

    iteration = iteration + 1 
    powerFailure = True 
    failedIteration = 10 
    previousPoint = False 
    eps = 1e-12 

    if powerFailure == True: 
     if iteration == failedIteration: 
      raise Exception("Optimization Ended Early Due to Power Failure") 

    for i in range(len(x_history)): 
     if abs(x_history[i,0]-x[0])<eps and abs(x_history[i,1]-x[1])<eps: 
      previousPoint = True 
      firstPoint=False 
      fx = fx_history[i,0] 
      print "%d: f(%f,%f)=%f (using history)" % (iteration,x[0],x[1],fx) 

    if previousPoint == False: 
     fx = rosen(x) 
     print "%d: f(%f,%f)=%f" % (iteration,x[0],x[1],fx) 

    if firstPoint == True: 
     x_history = np.atleast_2d([x]) 
     fx_history = np.atleast_2d([fx]) 
     firstPoint = False 
    else: 
     x_history = np.concatenate((x_history,np.atleast_2d(x)),axis=0) 
     fx_history = np.concatenate((fx_history,np.atleast_2d(fx)),axis=0) 

    return fx 

Schließlich führen wir die Optimierung.

firstPoint = True 
iteration = 0 

xopt, fopt, iter, funcalls, warnflag, allvecs = sp.optimize.fmin(f,x0,full_output=True,xtol=0.9,retall=True) 

Mit dem Stromausfall die Optimierung bei der Iteration 9. Nach dem „Einschalten der Stromversorgung zurück“

die Funktion druckt endet
1: f(1.050000,0.950000)=2.328125 (using history) 
2: f(1.102500,0.950000)=7.059863 (using history) 
3: f(1.050000,0.997500)=1.105000 (using history) 
4: f(0.997500,0.997500)=0.000628 (using history) 
5: f(0.945000,1.021250)=1.647190 (using history) 
6: f(0.997500,1.045000)=0.249944 (using history) 
7: f(0.945000,1.045000)=2.312665 (using history) 
8: f(1.023750,1.009375)=0.150248 (using history) 
9: f(1.023750,0.961875)=0.743420 (using history) 
10: f(1.004063,1.024219)=0.025864 
11: f(0.977813,1.)=0.316634 
12: f(1.012266,1.010117)=0.021363 
13: f(1.005703,0.983398)=0.078659 
14: f(1.004473,1.014014)=0.002569 
15: f(0.989707,1.001396)=0.047964 
16: f(1.006626,1.007937)=0.002916 
17: f(0.995347,1.003577)=0.016564 
18: f(1.003806,1.006847)=0.000075 
19: f(0.996833,0.990333)=0.001128 
20: f(0.998743,0.996253)=0.000154 
21: f(1.005049,1.005600)=0.002072 
22: f(0.999387,0.999525)=0.000057 
Optimization terminated successfully. 
     Current function value: 0.000057 
     Iterations: 11 
     Function evaluations: 22 
Verwandte Themen