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