J'ai hérité d'un code qui essaie de minimiser une fonction en utilisant scipy.optimize.minimize
. J'ai du mal à comprendre certaines des entrées des arguments fun
et jac
L'appel à minimiser ressemble à ceci:
result = minimize(func, jac=jac_func, args=(D_neg, D, C), method = 'TNC' ...other arguments)
func
ressemble à ceci:
def func(G, D_neg, D, C):
#do stuff
jac_func
a la structure suivante:
def jac_func(G, D_neg, D, C):
#do stuff
Ce que je ne comprends pas, c'est où l'entrée G de func
et jac_func
vient de. Est-ce en quelque sorte spécifié dans la fonction minimize
, ou par le fait que method
est spécifié comme TNC
? J'ai essayé de faire des recherches sur la structure de cette fonction d'optimisation mais j'ai du mal à trouver la réponse dont j'ai besoin. Toute aide est grandement appréciée
La réponse courte est que G
est maintenu par l'optimiseur dans le cadre du processus de minimisation, tandis que les arguments (D_neg, D, and C)
Sont transmis tels quels à partir du tuple args
.
Par défaut, scipy.optimize.minimize
Prend une fonction fun(x)
qui accepte un argument x
(qui peut être un tableau ou similaire) et retourne un scalaire. scipy.optimize.minimize
Trouve alors une valeur d'argument xp
telle que fun(xp)
est inférieure à fun(x)
pour les autres valeurs de x
. L'optimiseur est chargé de créer des valeurs de x
et de les transmettre à fun
pour évaluation.
Mais que se passe-t-il si vous avez une fonction fun(x, y)
qui a un paramètre supplémentaire y
qui doit être passé séparément (mais qui est considéré comme une constante aux fins de l'optimisation)? C'est à cela que sert le tuple args
. documentation essaie d'expliquer comment le tuple args est utilisé, mais il peut être un peu difficile à analyser:
args: Tuple, facultatif
Des arguments supplémentaires sont passés à la fonction objectif et à ses dérivées (jacobienne, hessienne).
En effet, scipy.optimize.minimize
Passera tout ce qui est dans args
comme le reste des arguments à fun
, en utilisant la notation des arguments astérisque: la fonction est alors appelée comme fun(x, *args)
pendant l'optimisation. La partie x
est transmise par l'optimiseur et le tuple args
est donné comme arguments restants.
Ainsi, dans votre code, la valeur de l'élément G
est conservée par l'optimiseur lors de l'évaluation des valeurs possibles de G
, et le tuple (D_neg, D, C)
Est transmis tel quel.