2016-07-29 24 views
2

ich mit etwa 1500 Variablen ein eingeschränktes Optimierungsproblem leite und es nimmt über 30 Minuten ....Scipy.optimize minimieren dauert zu lange

Wenn ich die Toleranz auf 1 die Minimierung reduzieren laufen vervollständigen in etwa fünf Minuten, aber das scheint keine gute Möglichkeit zu sein, die Dinge zu beschleunigen.

from scipy.optimize import minimize 

results = minimize(objFun, initialVals, method='SLSQP', bounds = bnds, constraints=cons, tol = toler) 

print(results) 

fun: -868.72033130318198 
jac: array([ 0., 0., 0., ..., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
nfev: 1459 
nit: 1 
njev: 1 
status: 0 
success: True 
x: array([ 0., 0., 0., ..., 1., 1., 1.]) 

Alle Vorschläge würden geschätzt.

+0

Haben Sie versucht, das Step-Size/Finite-Differential-Derivat Epsilon zu erhöhen? Manchmal wird es keinen/kleinen Fortschritt geben, wenn es zu klein ist, aber dies ist problemabhängig (Glätte ist ein großer Faktor). Sie könnten auch andere Optimierer ausprobieren. – sascha

+0

Nur eine Iteration benötigt? Sie sollten glücklich sein, Sieht so aus, als hätten Sie keine Gradienten bereitgestellt, also hat der Solver finite Differenzen gemacht. Ihre Funktionen scheinen teuer zu bewerten, und das Fehlen von verfügbaren Gradienten macht dieses Problem für diesen Solver nicht sehr geeignet. Möglicherweise müssen Sie sich einen abgeleiteten freien Solver ansehen. –

+0

Gibt es andere eingeschränkte Optimierungsbibliotheken für Python, die mit nichtlinearen Gleichungen arbeiten? Ich habe keine gesehen. –

Antwort

2

Hier ist, was ich tun würde:

  • die Minimierung Profil. Aus Ihrer Ausgabe scheint die Bewertung der Funktion der Flaschenhals zu sein. Überprüfen Sie, ob es so ist. Wenn ja, dann:
  • sehen Sie, ob Sie die Jacobi mit Papier und Bleistift oder einem CAS-System berechnen können. Verwenden Sie es anstelle von finiten Differenzen.
  • sehen, ob Sie die Funktion selbst (mathematische Vereinfachungen, numpy Vektorisierung, cython) beschleunigen kann
4

Ihre Toleranz festgelegt werden sollte, was auch immer Toleranz Sie benötigen. Wenn Sie den Wert höher setzen, wird der Optimierer eher angehalten und beschleunigt nicht. Davon abgesehen, könnte es eine Verschwendung Ihrer Zeit sein, wenn Sie es zu einer größeren Tollheit führen, wenn es nicht gebraucht wird.

Mögliche Wege sind, um die Zeit zu reduzieren, wie folgt:

  • Verwenden Sie eine andere optimiser
  • Verwenden Sie eine andere Steigung Methode zu finden
  • beschleunigen Ihre Zielfunktion
  • die Anzahl der Design reduzieren Variablen
  • Wählen Sie eine bessere erste Schätzung
  • Verwenden Sie die parallele Verarbeitung

Gradient Methoden

Wie Sie Finite-Differenzen verwenden, müssen Sie (1 + die Anzahl der Designvariablen) Auswertungen Ihrer Zielfunktion die Gesamtempfindlichkeit zu erhalten.

Wie ev-br sagte, wenn Sie die analytische Lösung zum jacobian finden, dann ist dies nicht erforderlich. Basierend auf der Tatsache, dass Sie 1500 Entwurfsvariablen haben. Ich denke, das ist nicht einfach, aber wenn Ihre objektive Funktion es erlaubt, könnte eine automatische Differenzierung eine Option sein. Iv hatte etwas Erfahrung mit AlgoPy, die Sie betrachten konnten.

Objektive Funktion Geschwindigkeit

Aufgrund der hohen Anzahl von Zielfunktion Auswertungen, kann dies der einfachste Ansatz. Noch einmal, ev-br's Antwort für Dinge wie kompilieren mit cython, und allgemeine Verringerung der Komplexität. Sie könnten versuchen, Teile des Codes unter Verwendung von timeit auszuführen, um zu sehen, ob Änderungen nützlich sind.

Designvariablen

die Anzahl der Designvariablen Reduzierung senkt linear die objektiven Funktionsaufrufe für die Finite-Differenzen benötigt. Ändern sich alle Ihre Variablen signifikant?Könnten einige auf einen festgelegten Wert festgelegt werden? Können Sie einige als eine Funktion von anderen ableiten?

Anfängliche Raten

auf Ihr Problem je, können Sie möglicherweise einen besseren Ausgangspunkt wählen, die Ihren optimiser bedeuten wird, ist ‚näher‘ an der Endlösung. Abhängig von Ihrem Problem können Sie Ihre Optimierung möglicherweise auch von einem früheren Ergebnis aus starten.

Parallelisierung

Die Finite-Differenzen-Auswertungen nicht haben, um zu tun, so dass Sie Ihre eigene Finite-Differenzen-Funktion schreiben könnten und dann die Anrufe parallel mit der multiprocessing Klasse laufen. Die Effektivität basiert auf Ihrem System und der Anzahl verfügbarer Kerne.

+0

Wie würde ich AlgoPy-generierte Derivate in die Minimierung integrieren? Da meine anfänglichen Annahmen ziemlich gut sind, scheint die jacobian Berechnung separat die beste Option zu sein. Ich könnte wahrscheinlich die Anzahl der Variablen reduzieren, also werde ich das auch untersuchen. –

+0

Das ist wahrscheinlich am besten eine eigene Frage, und ich habe es eine Weile nicht benutzt, aber im Allgemeinen erzeugt die automatische Differenzierung keine symbolische/kodierte Differentiationsfunktion, sondern gibt bei gegebenen Eingaben die Ableitungen mit diesen Eingaben durch Parsing Ihre ursprüngliche Funktion. Also denke ich, dass Ihre Verlaufsfunktion ein Wrapper für den Auto-Diff-Code wäre, der die Zielfunktion verwendet. – Wokpak

+0

Ok. Ich habe die Derivate von Hand berechnet und in eine Funktion gestellt, die die Jacobi an jedem Punkt zurückgibt ... wir werden sehen, wie das funktioniert. –