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?
Vous pouvez spécifier des arguments supplémentaires dans args
from scipy.optimize import minimize
minimize(f, x0, args=(a, b, c))
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.