[PYTHON] Die Geschichte, dass meine Pull-Anfrage in Scipy aufgenommen wurde

Was hast du getan?

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.

Was ist "scipy.optimize.minimize"?

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.

Was war das Problem

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.

Was ich gemacht habe Zeitreihen

(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.

Lernen / Eindruck

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

Die Geschichte, dass meine Pull-Anfrage in Scipy aufgenommen wurde
Die Geschichte, die scipy plötzlich aufhörte zu laden
Die Geschichte, dass XGBoost endlich installiert wurde
Die Geschichte, dass der Rückgabewert von tape.gradient () None war
Die Geschichte, die Japan ausgab, wurde mit Django verwechselt
Die Geschichte, dass die neue Zeichnungsbibliothek "HiPlot" ziemlich gut war
Die Geschichte, dass die Version von Python 3.7.7 nicht an Heroku angepasst wurde
Die Geschichte, dass die Homebrew-Umgebung bei der Installation von Anaconda umgehauen wurde
Die Geschichte, dass der Wachmann eingesperrt war, als das Labor auf IoT umgestellt wurde
Die Geschichte, dass die asynchrone API, die API-Gateway- und Schrittfunktionen kombinierte, die stärkste war
Die Geschichte, mit der ich mich befasst habe, weil Apache bei AH00144 war
Die Geschichte, dass FastAPI die Vormachtstellung übernehmen könnte