web-dev-qa-db-fra.com

Fonction de minimisation avec paramètres

Actuellement, j'ai le code suivant qui définit la fonction f.

a = #something
b = #something
c = #something
def f(x):
    """Evaluates some function that depends on parameters a, b, and c"""
    someNumber = #some calculation
    return someNumber

Idéalement, je ferais def f(x, a, b, c), MAIS je minimise f par rapport à x et la boîte à outils d'optimisation de SciPy ne permet pas de minimiser les fonctions avec des paramètres dans les arguments. Cela dit, je voudrais exécuter mon code de minimisation pour plusieurs valeurs de a, b Et c. Existe-t-il un moyen de le faire?

10
Nate Stemen

Vous pouvez spécifier des arguments supplémentaires dans args

from scipy.optimize import minimize 
minimize(f, x0, args=(a, b, c))
15
Liteye

Il s'agit d'une simple question et réponse sur l'utilisation de minimize. Au cas où d'autres utilisateurs auraient besoin de quelque chose de plus concret, voici un exemple simple.

Une équation quadratique généralisée:

In [282]: def fun(x, a,b,c):
     ...:     return a*x**2 + b*x + c

In [283]: optimize.minimize(fun, 10, args=(1,0,0))
Out[283]: 
      fun: 1.7161984122524196e-15
 hess_inv: array([[ 0.50000001]])
      jac: array([ -6.79528891e-08])
  message: 'Optimization terminated successfully.'
     nfev: 15
      nit: 4
     njev: 5
   status: 0
  success: True
        x: array([ -4.14270251e-08])

In [284]: optimize.minimize(fun, 10, args=(1,1,1))
Out[284]: 
      fun: 0.7500000000000221
 hess_inv: array([[ 0.49999999]])
      jac: array([  3.12924385e-07])
  message: 'Optimization terminated successfully.'
     nfev: 12
      nit: 2
     njev: 4
   status: 0
  success: True
        x: array([-0.49999985])

La fonction peut également prendre des tableaux en entrée, mais doit toujours renvoyer une seule valeur (scalaire):

In [289]: optimize.minimize(fun, [10,10,10], args=(np.array([1,2,3]), 1, 1))
Out[289]: 
      fun: 2.541666666667115
 hess_inv: array([[ 0.50021475, -0.00126004,  0.00061239],
       [-0.00126004,  0.25822101, -0.00259327],
       [ 0.00061239, -0.00259327,  0.16946887]])
      jac: array([ -8.94069672e-08,   4.47034836e-07,  -2.20537186e-06])
  message: 'Optimization terminated successfully.'
     nfev: 55
      nit: 9
     njev: 11
   status: 0
  success: True
        x: array([-0.50000006, -0.2499999 , -0.16666704])

In [286]: def fun(x, a,b,c):
 ...:     return (a*x**2 + b*x + c).sum()

C'est une bonne idée de s'assurer que la fonction s'exécute avec le x0 et args, par exemple.

In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1)
Out[291]: 633

Si vous ne pouvez pas appeler la fonction objectif ou si vous ne savez pas comment ses arguments fonctionnent, minimize n'est pas une solution miracle. Cette minimisation ne dépend que de votre compréhension de la fonction objectif.

4
hpaulj