Scipy.optimize: Wie schränkt man die Argumentwerte ein?

9

Ich versuche mit scipy.optimize functions ein globales Minimum einer komplizierten Funktion mit mehreren Argumenten zu finden. scipy.optimize.minimize scheint die beste Arbeit zu leisten, nämlich die "Nelder-Mead" -Methode. Es wird jedoch eher in Bereiche außerhalb der Argumentdomäne verzweigt (um nur Argumenten, die nur positiv sein können, negative Werte zuzuweisen) und in solchen Fällen einen Fehler zurückgegeben. Gibt es eine Möglichkeit, die Grenzen der Argumente innerhalb der Funktion scipy.optimize.minimize selbst einzuschränken? Oder vielleicht in anderen scipy.optimize Funktionen?

Ich habe folgenden Rat gefunden:

  

Wenn die Parameter außerhalb des zulässigen Bereichs liegen, geben Sie eine sehr große Zahl zurück (weit entfernt von den anzupassenden Daten). Dies wird (hoffentlich) die Wahl der Parameter so sehr bestrafen, dass curve_fit sich auf einen anderen zulässigen Parametersatz als optimal einstellt.

in dieser vorherigen Antwort gegeben , aber das Verfahren wird dauern viel Rechenzeit in meinem Fall.

    
Alexandra Shchukina 08.10.2013, 09:54
quelle

4 Antworten

15

Der Nelder-Mead-Solver unterstützt keine eingeschränkte Optimierung, aber es gibt mehrere andere, die das tun.

TNC und L-BFGS-B unterstützen beide nur gebundene Einschränkungen (z. B. x[0] >= 0 ), was für Ihren Fall in Ordnung sein sollte. COBYLA und SLSQP sind flexibler und unterstützen jede Kombination von Grenzen, Gleichheit und Ungleichheitsbasierten Einschränkungen.

Sie können detailliertere Informationen über die Solver finden, indem Sie sich die Dokumente für die Standalone-Funktionen ansehen, z. scipy.optimize.fmin_slsqp für method='SLSQP' .

Sie können meine vorherige Antwort sehen hier für ein Beispiel der eingeschränkten Optimierung mit SLSQP.

    
ali_m 08.10.2013, 10:30
quelle
17

Die Funktion minimize hat eine bounds -Parameter , der verwendet werden kann, um die Grenzen für jede Variable einzuschränken, wenn die Methoden L-BFGS-B, TNC, COBYLA oder SLSQP verwendet werden.

Zum Beispiel

%Vor%     
unutbu 08.10.2013 10:29
quelle
1

Ich weiß, das ist spät im Spiel, aber schaut euch vielleicht mystic an. Sie können beliebige Python-Funktionen als Penalty-Funktionen anwenden oder bounds-Constraints und mehr ... auf jeden Optimierer anwenden (einschließlich des Algorithmus aus scipy.optimize.fmin ).

Ссылка

    
Mike McKerns 07.07.2015 02:09
quelle
1

Das Argument, nach dem Sie suchen, lautet: constraints , eines der Argumente, die an scipy.minimize übergeben werden. Rollen Sie Ihre eigene Lambda-Funktion, die die folgenden Parameter erhält:

%Vor%

Das obige Beispiel behauptet, dass alle neuen Kandidaten in der Nachbarschaft des letzten gesuchten Gegenstands besser 50 ergeben. Ändere diese Methode, um den zulässigen Suchraum zu definieren, und die scipy.minimize-Funktion wird keine Energie verschwenden, wenn man diese Antworten berücksichtigt / p>     

Eric Leschinski 06.09.2016 00:18
quelle

Tags und Links