web-dev-qa-db-fra.com

Structure des entrées pour minimiser la fonction scipy

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

24
sedavidw

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.

38
lmjohns3