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.
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
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. –
Gibt es andere eingeschränkte Optimierungsbibliotheken für Python, die mit nichtlinearen Gleichungen arbeiten? Ich habe keine gesehen. –