[PYTHON] L'histoire selon laquelle ma pull request a été intégrée à Scipy

Qu'est-ce que tu as fait?

scipy.optimize.minimize avait une spécification ou un bogue très subtile. Je pensais que c'était proche d'un bogue, mais quand je l'ai corrigé, les personnes qui l'utilisaient déjà semblaient avoir des problèmes, alors j'ai créé un problème et j'ai demandé: "Si vous voulez le corriger, je vais vous donner une pull request?" J'étais censé lancer une demande d'extraction, alors je l'ai envoyée. Tout récemment, il a finalement été fusionné.

Qu'est-ce que «scipy.optimize.minimize»?

Si vous lui donnez une fonction, cela optimisera joliment les paramètres et minimisera la valeur renvoyée par la fonction. Par exemple, disons que vous avez l'expression $ z = 2x ^ 2 + (3y - 2) ^ 2 + xy $. Il résout ce qui est $ x, y $ qui fait de $ z $ le plus petit? En un coup d'œil, vous pouvez voir que lorsque $ x = 0, y = 2/3 $, ce sera zéro, et ce sera plus petit que cela.

def f(x, y):
    return 2 * x**2 + (3*y - 2)**2 + x*y
    
print(scipy.optimize.minimize(f, [0., 0.]))

Et, si vous donnez une fonction et une valeur initiale appropriée ([0., 0.]), il vous demandera une belle valeur. Lorsqu'il s'agit d'un tableau ([-0.16901447, 0.67605677]), il semble être -0.05633802816721355.

Quel était le problème

scipy.optimize.minimize fournit plusieurs algorithmes de minimisation, qui peuvent être sélectionnés en donnant l'argument method =" ... ". Au fait, un peu de gêne se produit uniquement lorsqu'il n'y a qu'un seul argument et que vous utilisez la méthode "Powell".

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

Avez-vous compris? La valeur de retour «shape» est différente.

En fait, en plus de cela, j'ai essayé les 14 types, y compris ceux qui doivent spécifier Jacobien et ceux qui doivent spécifier Hesian, mais seule la méthode "Powell" était comme ça.

Eh bien, c'est un bug. C'est un projet historique. Il peut être difficile de décider de le réparer ou non maintenant. Déjà, Powell peut affecter ceux qui croient cela et l'utilisent. Mais bon, j'ai décidé de demander parce que c'était un gros problème.

Ce que j'ai fait Série chronologique

(Janvier 2019) Je l'ai donc fourchu pour le moment et j'ai essayé de le réparer dans mon référentiel. Je savais que je pouvais résoudre ce problème, alors j'ai mis en place un problème, mis en place le lien fixe, et j'ai dit: "Si tout va bien, je vais publier un PR." https://github.com/scipy/scipy/issues/9715

(Août 2019) Puis, il a dit: "C'est un bogue, il est donc préférable de le corriger, mais en raison de problèmes de compatibilité, je veux que vous changiez la fonction pour mettre le correctif." J'ai donc émis un PR de cette façon. https://github.com/scipy/scipy/pull/10640

(Septembre 2019) Les changements sont bons, mais le test ajouté est un peu redondant, alors j'ai reçu un commentaire disant que je devrais le corriger, alors je l'ai corrigé, etc. Il est resté sans réponse pendant un moment.

(Décembre 2019) Il a été fusionné avec master.

Cela a pris environ un an. Je pense que les développeurs étaient également occupés et que le contenu n'était pas si gros, donc la priorité était faible.

Apprentissage / impression

L'open source est non seulement gratuit à utiliser, mais aussi plein d'opportunités comme celle-ci. Même si c'est très ennuyeux, cela peut être une chance de contribuer si vous pensez "ça?" J'aimerais continuer à contribuer à l'open source s'il y a quelque chose que je peux faire.

Recommended Posts

L'histoire selon laquelle ma pull request a été intégrée à Scipy
L'histoire que scipy a soudainement arrêté de se charger
L'histoire que XGBoost a finalement été installé
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
L'histoire de la confusion entre la production japonaise et Django
L'histoire selon laquelle la nouvelle bibliothèque de dessins "HiPlot" était plutôt bonne
L'histoire selon laquelle la version de python 3.7.7 n'était pas adaptée à Heroku
L'histoire selon laquelle l'environnement Homebrew a été époustouflé lors de l'installation d'Anaconda
L'histoire selon laquelle le gardien était confiné lorsque le laboratoire a été converti à l'IoT
L'histoire selon laquelle l'API asynchrone qui combinait API Gateway et Step Functions était la plus forte
L'histoire que j'ai traitée parce qu'Apache était en panne à AH00144
L'histoire que FastAPI peut prendre la suprématie