Scipy-optimize

提供:Dev Guides
移動先:案内検索

SciPy-最適化

  • scipy.optimizeパッケージ*は、一般的に使用されるいくつかの最適化アルゴリズムを提供します。 このモジュールには、次の側面が含まれています-
  • さまざまなアルゴリズムを使用した多変量スカラー関数の制約なしおよび制約付き最小化(minimize()) BFGS、Nelder-Meadシンプレックス、ニュートン共役勾配、COBYLAまたはSLSQP)
  • グローバル(総当たり)最適化ルーチン(anneal()、basinhopping()など)
  • 最小二乗最小化(leastsq())および曲線近似(curve_fit())アルゴリズム
  • スカラー単変量関数ミニマイザー(minimize_scalar())およびルートファインダー(newton())
  • さまざまなアルゴリズムを使用した多変量方程式システムソルバー(root())(例: ハイブリッドパウエル、レーベンバーグマルカート、またはニュートンクリロフなどの大規模手法)

多変数スカラー関数の制約なしおよび制約付き最小化

  • minimize()関数*は、 scipy.optimize の多変量スカラー関数の制約なしおよび制約付き最小化アルゴリズムへの共通インターフェースを提供します。 最小化関数を実証するために、NN変数のRosenbrock関数を最小化する問題を考えます-

f(x)= \ sum _ \ {i = 1} ^ \ {N-1} \:100(x_i-x _ \ {i-1} ^ \ {2})

この関数の最小値は0です。これは、xi = 1のときに達成されます。

Nelder–Meadシンプレックスアルゴリズム

次の例では、minimum()ルーチンが* Nelder-Meadシンプレックスアルゴリズム(method = 'Nelder-Mead')*(methodパラメーターで選択)と共に使用されます。 次の例を考えてみましょう。

import numpy as np
from scipy.optimize import minimize

def rosen(x):

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')

print(res.x)

上記のプログラムは、次の出力を生成します。

[7.93700741e+54  -5.41692163e+53  6.28769150e+53  1.38050484e+55  -4.14751333e+54]

シンプレックスアルゴリズムは、おそらく、適切に機能する関数を最小化する最も簡単な方法です。 関数の評価のみが必要であり、単純な最小化問題に適しています。 ただし、勾配評価を使用しないため、最小値を見つけるのに時間がかかる場合があります。

最小値を見つけるために関数呼び出しのみを必要とする別の最適化アルゴリズムは、* Powellのメソッド*です。これは、minimize()関数でmethod = 'powell’を設定することで使用できます。

最小二乗

変数に境界がある非線形最小二乗問題を解きます。 残差f(x)(n個の実変数のm次元の実関数)および損失関数rho(s)(スカラー関数)が与えられると、least_squaresはコスト関数F(x)の局所的最小値を見つけます。 次の例を考えてみましょう。

この例では、独立変数に制限のないRosenbrock関数の最小値を見つけます。

#Rosenbrock Function
def fun_rosenbrock(x):
   return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])

from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)

print res

残差のベクトルのみを提供することに注意してください。 アルゴリズムは、コスト関数を残差の二乗和として構築し、Rosenbrock関数を提供します。 正確な最小値はx = [1.0,1.0]です。

上記のプログラムは、次の出力を生成します。

active_mask: array([ 0., 0.])
      cost: 9.8669242910846867e-30
      fun: array([ 4.44089210e-15, 1.11022302e-16])
      grad: array([ -8.89288649e-14, 4.44089210e-14])
      jac: array([[message: '`gtol` termination condition is satisfied.'
      nfev: 3
      njev: 3
   optimality: 8.8928864934219529e-14
      status: 1
      success: True
         x: array([ 1., 1.])

根の発見

SciPyでルート検索がどのように役立つかを理解しましょう。

スカラー関数

単一変数の方程式がある場合、4つの異なるルート検索アルゴリズムがあり、それらを試すことができます。 これらの各アルゴリズムには、ルートが予想される間隔のエンドポイントが必要です(関数が符号を変更するため)。 一般に、 brentq が最適な選択ですが、他の方法は特定の状況や学術目的で役立つ場合があります。

固定小数点ソルバー

関数のゼロを見つけることに密接に関連する問題は、関数の不動点を見つける問題です。 関数の固定小数点は、関数の評価がポイントを返すポイントです:g(x)= x。 明らかに gg の不動点はf(x)= g(x)−xの根です。 同様に、 ff のルートは、g(x)= f(x)+ xのfixed_pointです。 ルーチンfixed_pointは、開始点が指定されている場合、* Aitkensシーケンスアクセラレーション*を使用して gg の固定点を推定する単純な反復メソッドを提供します。

方程式のセット

非線形方程式のセットのルートを見つけるには、* root()関数*を使用します。 いくつかの方法が利用できますが、その中で hybr (デフォルト)およびlmは、それぞれMINPACKの hybrid method of Powell および Levenberg-Marquardt method を使用します。

次の例では、単一変数の超越方程式を考慮します。

*x ^ 2 ^ + 2cos(x)= 0*

そのルートは次のように見つけることができます-

import numpy as np
from scipy.optimize import root
def func(x):
   return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol

上記のプログラムは、次の出力を生成します。

fjac: array([[fun: array([ 2.22044605e-16])
message: 'The solution converged.'
   nfev: 10
   qtf: array([ -2.77644574e-12])
      r: array([-3.34722409])
   status: 1
   success: True
      x: array([-0.73908513])