brute#
- scipy.optimize.brute(func, ranges, args=(), Ns=20, full_output=0, finish=<function fmin>, disp=False, workers=1)[Quelle]#
Minimiert eine Funktion über einen gegebenen Bereich mittels Brute-Force.
Verwendet die „Brute-Force“-Methode, d.h., berechnet den Funktionswert an jedem Punkt eines mehrdimensionalen Gitters von Punkten, um das globale Minimum der Funktion zu finden.
Die Funktion wird überall im Bereich mit dem Datentyp des ersten Funktionsaufrufs ausgewertet, wie er von der NumPy-Funktion
vectorizeerzwungen wird. Der Wert und Typ der Funktionsauswertung, die beifull_output=Truezurückgegeben werden, werden zusätzlich durch das Argumentfinishbeeinflusst (siehe Hinweise).Der Brute-Force-Ansatz ist ineffizient, da die Anzahl der Gitterpunkte exponentiell ansteigt – die Anzahl der zu auswertenden Gitterpunkte ist
Ns ** len(x). Folglich können selbst bei grober Gitterabstandsauflösung selbst mäßig große Probleme lange dauern und/oder zu Speicherbeschränkungen führen.- Parameter:
- funccallable
Die zu minimierende Zielfunktion. Muss im Format
f(x, *args)sein, wobeixdas Argument in Form eines 1D-Arrays undargsein Tupel zusätzlicher fester Parameter ist, die zur vollständigen Spezifikation der Funktion erforderlich sind.- rangestuple
Jede Komponente des ranges Tupels muss entweder ein „Slice-Objekt“ oder ein Bereichstupel der Form
(low, high)sein. Das Programm verwendet diese, um das Gitter von Punkten zu erstellen, auf denen die Zielfunktion berechnet wird. Siehe Hinweis 2 für weitere Details.- argstuple, optional
Zusätzliche feste Parameter, die zur vollständigen Spezifikation der Funktion erforderlich sind.
- Nsint, optional
Anzahl der Gitterpunkte entlang der Achsen, falls nicht anders angegeben. Siehe Hinweis 2.
- full_outputbool, optional
Wenn True, gib das Auswertungsraster und die Zielfunktionswerte darauf zurück.
- finishcallable, optional
Eine Optimierungsfunktion, die mit dem Ergebnis der Brute-Force-Minimierung als Startwert aufgerufen wird. finish sollte func und den Startwert als Positionsargumente sowie args als Schlüsselwortargumente entgegennehmen. Es kann zusätzlich full_output und/oder disp als Schlüsselwortargumente annehmen. Verwenden Sie None, wenn keine „Polishing“-Funktion verwendet werden soll. Siehe Hinweise für weitere Details.
- dispbool, optional
Auf True gesetzt, um Konvergenzmeldungen vom finish Callable auszugeben.
- workersint oder Map-ähnliches aufrufbare Objekt, optional
Wenn workers ein int ist, wird das Gitter in workers Abschnitte unterteilt und parallel ausgewertet (verwendet
multiprocessing.Pool). Geben Sie -1 an, um alle verfügbaren Kerne des Prozesses zu nutzen. Alternativ können Sie ein map-ähnliches Callable übergeben, z.B. multiprocessing.Pool.map, um das Gitter parallel auszuwerten. Diese Auswertung erfolgt alsworkers(func, iterable). Erfordert, dass func pickelbar ist.Hinzugefügt in Version 1.3.0.
- Rückgabe:
- x0ndarray
Ein 1D-Array mit den Koordinaten eines Punkts, an dem die Zielfunktion ihren Minimalwert hatte. (Siehe Hinweis 1, welcher Punkt zurückgegeben wird.)
- fvalfloat
Funktionswert am Punkt x0. (Zurückgegeben, wenn full_output True ist.)
- gridtuple
Darstellung des Auswertungsrasters. Es hat die gleiche Länge wie x0. (Zurückgegeben, wenn full_output True ist.)
- Joutndarray
Funktionswerte an jedem Punkt des Auswertungsrasters, d.h.
Jout = func(*grid). (Zurückgegeben, wenn full_output True ist.)
Siehe auch
Hinweise
Hinweis 1: Das Programm findet den Gitterpunkt, an dem der niedrigste Wert der Zielfunktion auftritt. Wenn finish None ist, ist das der zurückgegebene Punkt. Wenn das globale Minimum innerhalb (oder nicht sehr weit außerhalb) der Gittergrenzen auftritt und das Gitter fein genug ist, wird dieser Punkt in der Nähe des globalen Minimums liegen.
Benutzer verwenden oft ein anderes Optimierungsprogramm, um die Gitterpunktwerte zu „polieren“, d.h. um ein präziseres (lokales) Minimum in der Nähe des besten Gitterpunkts von brute zu suchen. Die Option finish der Funktion
brutebietet eine bequeme Möglichkeit dafür. Jedes verwendete Polishing-Programm muss die Ausgabe von brute als Startwert als Positionsargument entgegennehmen und die Eingabewerte von brute für args als Schlüsselwortargumente entgegennehmen, andernfalls wird ein Fehler ausgelöst. Es kann zusätzlich full_output und/oder disp als Schlüsselwortargumente annehmen.brutegeht davon aus, dass die Funktion finish entweder einOptimizeResult-Objekt oder ein Tupel der Form zurückgibt:(xmin, Jmin, ... , statuscode), wobeixminder minimierende Wert des Arguments ist,Jminder Minimalwert der Zielfunktion ist, „…“ können andere zurückgegebene Werte sein (die vonbrutenicht verwendet werden) undstatuscodeist der Statuscode des finish Programms.Beachten Sie, dass, wenn finish nicht None ist, die zurückgegebenen Werte die der finish Funktion sind, *nicht* die Gitterpunktwerte. Folglich werden die Ergebnisse des finish Programms normalerweise nicht mit einem Gitterpunkt übereinstimmen und können außerhalb der Gittergrenzen liegen, obwohl
bruteseine Suche auf die eingegebenen Gitterpunkte beschränkt. Wenn also nur ein Minimum über die bereitgestellten Gitterpunkte gefunden werden muss, stellen Sie sicher, dassfinish=Noneübergeben wird.Hinweis 2: Das Gitter von Punkten ist ein
numpy.mgridObjekt. Fürbrutehaben die Eingaben ranges und Ns die folgende Auswirkung. Jede Komponente des ranges Tupels kann entweder ein Slice-Objekt oder ein Zweier-Tupel sein, das einen Wertebereich angibt, z.B. (0, 5). Wenn die Komponente ein Slice-Objekt ist, verwendetbrutees direkt. Wenn die Komponente ein Zweier-Tupel-Bereich ist, konvertiertbrutees intern in ein Slice-Objekt, das Ns Punkte von seinem niedrigeren zum höheren Wert interpoliert, einschließlich beider.Beispiele
Wir illustrieren die Verwendung von
brute, um das globale Minimum einer Funktion von zwei Variablen zu suchen, die als Summe einer positiv-definiten quadratischen Funktion und zweier tiefer „Gauß-förmiger“ Krater gegeben ist. Speziell definieren wir die Zielfunktion f als die Summe von drei anderen Funktionen,f = f1 + f2 + f3. Wir nehmen an, dass jede dieser Funktionen eine Signatur(z, *params)hat, wobeiz = (x, y)undparamssowie die Funktionen wie unten definiert sind.>>> import numpy as np >>> params = (2, 3, 7, 8, 9, 10, 44, -1, 2, 26, 1, -2, 0.5) >>> def f1(z, *params): ... x, y = z ... a, b, c, d, e, f, g, h, i, j, k, l, scale = params ... return (a * x**2 + b * x * y + c * y**2 + d*x + e*y + f)
>>> def f2(z, *params): ... x, y = z ... a, b, c, d, e, f, g, h, i, j, k, l, scale = params ... return (-g*np.exp(-((x-h)**2 + (y-i)**2) / scale))
>>> def f3(z, *params): ... x, y = z ... a, b, c, d, e, f, g, h, i, j, k, l, scale = params ... return (-j*np.exp(-((x-k)**2 + (y-l)**2) / scale))
>>> def f(z, *params): ... return f1(z, *params) + f2(z, *params) + f3(z, *params)
Somit kann die Zielfunktion lokale Minima in der Nähe des Minimums jeder der drei Funktionen haben, aus denen sie sich zusammensetzt. Um
fminzu verwenden, um ihr Gitterpunkt-Ergebnis zu polieren, können wir dann wie folgt fortfahren:>>> rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25)) >>> from scipy import optimize >>> resbrute = optimize.brute(f, rranges, args=params, full_output=True, ... finish=optimize.fmin) >>> resbrute[0] # global minimum array([-1.05665192, 1.80834843]) >>> resbrute[1] # function value at global minimum -3.4085818767
Beachten Sie, dass, wenn finish auf None gesetzt worden wäre, wir den Gitterpunkt [-1.0 1.75] erhalten hätten, an dem der gerundete Funktionswert -2,892 beträgt.