scipy.optimize.minimize
hatte eine sehr subtile Spezifikation oder einen Fehler.
Ich dachte, es wäre fast ein Fehler, aber als ich ihn behoben habe, schienen Leute, die ihn bereits verwendeten, in Schwierigkeiten zu sein. Deshalb habe ich ein Problem eingerichtet und gefragt: "Wenn Sie es beheben möchten, gebe ich Ihnen eine Pull-Anfrage?"
Ich sollte eine Pull-Anfrage stellen, also habe ich sie gelöscht.
Erst kürzlich wurde es endgültig zusammengeführt.
Wenn Sie ihm eine Funktion geben, werden die Parameter optimiert und der von der Funktion zurückgegebene Wert minimiert. Angenommen, Sie haben den Ausdruck $ z = 2x ^ 2 + (3y - 2) ^ 2 + xy $. Es löst, was $ x, y $ ist, was $ z $ zum kleinsten macht? Auf einen Blick können Sie sehen, dass wenn $ x = 0, y = 2/3 $ ist, es Null ist und es kleiner als das ist.
def f(x, y):
return 2 * x**2 + (3*y - 2)**2 + x*y
print(scipy.optimize.minimize(f, [0., 0.]))
Und wenn Sie eine Funktion und einen geeigneten Anfangswert ([0., 0.]
) angeben, werden Sie nach einem schönen Wert gefragt.
Wenn es sich um ein Array handelt ([-0.16901447, 0.67605677]), scheint es -0.05633802816721355 zu sein.
scipy.optimize.minimize
bietet mehrere Algorithmen zur Minimierung, die durch Angabe des Arguments method =" ... "
ausgewählt werden können.
Ein bisschen Ärger passiert übrigens nur, wenn es nur ein Argument gibt und wenn Sie die "Powell" -Methode verwenden.
import numpy as np
import scipy.optimize
def fun(x):
return x*x
res = scipy.optimize.minimize(fun, [0.1], method="Nelder-Mead")
print("Nelder-Mead:")
print("Optimized:", res.x, "Shape:", res.x.shape)
res = scipy.optimize.minimize(fun, [0.1], method="COBYLA")
print("COBYLA:")
print("Optimized:", res.x, "Shape:", res.x.shape)
res = scipy.optimize.minimize(fun, [0.1], method="Powell")
print("Powell:")
print("Optimized:", res.x, "Shape:", res.x.shape)
Nelder-Mead:
Optimized: [1.94289029e-16] Shape: (1,)
COBYLA:
Optimized: [0.00010234] Shape: (1,)
Powell:
Optimized: 4.163336342344337e-17 Shape: ()
Hast du verstanden? Der Rückgabewert "Form" ist unterschiedlich.
Zusätzlich dazu habe ich alle 14 Typen ausprobiert, einschließlich derer, die Jacobian angeben müssen, und derjenigen, die Hesian angeben müssen, aber nur die "Powell" -Methode war so.
Nun, es ist ein Fehler. Dies ist ein historisches Projekt. Es kann schwierig sein, zu entscheiden, ob das Problem jetzt behoben werden soll oder nicht. Powell kann bereits diejenigen betreffen, die dies glauben und es verwenden. Aber nun, ich habe mich entschlossen zu fragen, weil es eine große Sache war.
(Januar 2019) Also habe ich es vorerst gegabelt und versucht, es in meinem Repository zu reparieren. Ich wusste, dass ich es beheben konnte, also richtete ich ein Problem ein, stellte den festen Link ein und sagte: "Wenn das in Ordnung ist, werde ich eine PR ausstellen." https://github.com/scipy/scipy/issues/9715
(August 2019) Dann sagte er: "Es ist ein Fehler, daher ist es besser, ihn zu beheben, aber aufgrund von Kompatibilitätsproblemen möchte ich, dass Sie die Funktion ändern, um den Fix einzufügen." Also habe ich auf diese Weise eine PR herausgegeben. https://github.com/scipy/scipy/pull/10640
(September 2019) Die Änderungen sind gut, aber der hinzugefügte Test ist etwas überflüssig, daher habe ich einen Kommentar erhalten, der besagt, dass ich ihn reparieren soll, also habe ich ihn repariert usw. Es blieb eine Weile unbeantwortet.
(Dezember 2019) Es wurde in Master zusammengeführt.
Es dauerte ungefähr ein Jahr. Ich denke, dass die Entwickler auch beschäftigt waren und der Inhalt nicht so groß war, so dass die Priorität niedrig war.
Open Source ist nicht nur kostenlos zu nutzen, sondern auch voller solcher Möglichkeiten. Auch wenn es sehr langweilig ist, kann es eine Chance sein, einen Beitrag zu leisten, wenn Sie "das" denken? Ich möchte weiterhin zu Open Source beitragen, wenn ich etwas tun kann.
Recommended Posts