2017-03-25 2 views
3

Actuellement, j'ai le code suivant qui définit la fonction f.Réduire la fonction avec les paramètres

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 voudrais faire def f(x, a, b, c), mais je suis en minimisant f par rapport à x et la boîte à outils d'optimisation de SciPy ne permet pas une pour minimiser les fonctions avec les paramètres dans les arguments. Cela dit, je voudrais exécuter mon code de minimisation pour plusieurs valeurs de a, b et c. Y a-t-il un moyen de le faire?

+2

"Figer" la fonction avec des valeurs particulières "a, b, c" en utilisant 'functools.partial'? –

+0

@ PM2Ring cela fonctionnerait, et je suis heureux de savoir que cet outil est maintenant disponible, mais comme @Liteye l'a fait remarquer, 'minimiser 'me permet en fait de lui passer les paramètres. Merci! –

+1

Pas de soucis. 'partial' est génial quand vous en avez besoin, mais je ne connais pas SciPy, donc c'était seulement une suggestion. De toute évidence, la réponse de Liteye est la bonne façon de le faire. :) –

Répondre

7

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

minimize(f, x0, args=(a, b, c)) 
+0

Je ne peux pas croire que je n'ai pas vu cela dans les docs. Je vous remercie! –

1

Ceci est une question simple et de répondre sur l'utilisation 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 pourrait prendre des tableaux en entrée aussi bien, mais doit encore revenir un seul (scalaire) Valeur:

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

Il est une bonne idée de assurez-vous que la fonction fonctionne avec le x0 proposé 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 objective, ou sont confus quant à la façon dont ses arguments fonctionnent, minimize n'est pas une balle magique. Cette minimisation est seulement aussi bonne que votre compréhension de la fonction objective.