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.
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.
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
).
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:
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>