web-dev-qa-db-ja.com

パラメータを使用して関数を最小化する

現在、関数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
_

理想的にはdef f(x, a, b, c)を実行しますが、fに関してxを最小化しています。SciPyの最適化ツールボックスでは、引数にパラメーターを持つ関数を最小化できません。つまり、_a, b_とcの複数の値に対して最小化コードを実行したいと思います。これを行う方法はありますか?

10
Nate Stemen

argsに追加の引数を指定できます

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

これは、minimizeの使用に関する簡単な質問と回答です。他のユーザーがより具体的なものが必要な場合のために、ここに簡単な例を示します。

一般化された二次方程式:

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

この関数は配列を入力として受け取ることもできますが、それでも単一の(スカラー)値を返す必要があります。

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

関数が提案されたx0と引数を使用して実行されることを確認することをお勧めします。

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

目的関数を呼び出せない場合、またはその引数の機能について混乱している場合、minimizeは特効薬ではありません。この最小化は、目的関数の理解と同じくらい優れています。

4
hpaulj