英語版
Optimization and root finding (scipy.optimize) — SciPy v1.3.0 Reference Guide
参考リンク
最適化と求根 (scipy.optimize)
SciPy optimize
は、場合によっては制約を受けることのある目的関数を最小化(または最大化)するための関数を提供します。非線形問題(局所的および大域的最適化アルゴリズムの両方をサポートする)、線形計画法、制約付きおよび非線形最小二乗法、球根およびカーブフィッティングのためのソルバーを含んでいます。
異なるソルバー間で共有される共通の関数とオブジェクトは、次のものがあります。
show_options([solver, method, disp]) 最適化ソルバーの追加オプションのドキュメントを表示する。
OptimizeResult 最適化結果を表す
OptimizeWarning
最適化
スカラー関数最適化
minimize_scalar(fun[, bracket, bounds, …]) 単一変数のスカラー関数の最小化
minimize_scalar関数は次の方法をサポートします。
局所(多変数)最適化
minimize(fun, x0[, args, method, jac, hess, …]) 1つ以上の変数のスカラー関数の最小化
minimize関数は次の方法をサポートします。
- minimize(method=’Nelder-Mead’)
- minimize(method=’Powell’)
- minimize(method=’CG’)
- minimize(method=’BFGS’)
- minimize(method=’Newton-CG’)
- minimize(method=’L-BFGS-B’)
- minimize(method=’TNC’)
- minimize(method=’COBYLA’)
- minimize(method=’SLSQP’)
- minimize(method=’trust-constr’)
- minimize(method=’dogleg’)
- minimize(method=’trust-ncg’)
- minimize(method=’trust-krylov’)
- minimize(method=’trust-exact’)
制約条件は下記クラスの単一オブジェクトまたはオブジェクトのリストとしてminimize関数に渡されます。
NonlinearConstraint(fun, lb, ub[, jac, …]) 変数についての非線形制約条件
LinearConstraint(A, lb, ub[, keep_feasible]) 変数についての線形制約条件
単純な境界制約条件は個別に処理され、そのための特別なクラスがあります。
Bounds(lb, ub[, keep_feasible]) 変数についての境界制約条件
HessianUpdateStrategyインターフェイスを実装する準ニュートン法はminimize関数内でヘッセ行列を近似することができます(trust-constr法でのみ利用可)。このインターフェイスを実装する準ニュートン法は以下が利用できます。
BFGS([exception_strategy, min_curvature, …]) Broyden-Fletcher-Goldfarb-Shanno (BFGS) ヘッセ行列更新戦略
SR1([min_denominator, init_scale]) 対称ランクワン ヘッセ行列更新戦略
大域最適化
basinhopping(func, x0[, niter, T, stepsize, …]) basin-hoppingアルゴリズムを使って関数の大域最小値を求める。
brute(func, ranges[, args, Ns, full_output, …]) 与えられた範囲でブルートフォース法によって関数を最小化する。
differential_evolution(func, bounds[, args, …]) 多変数関数の大域最小値を求める。
shgo(func, bounds[, args, constraints, n, …]) SHG最適化を用いて関数の大域最小値を求める。
dual_annealing(func, bounds[, args, …]) Dual Annealingを用いて関数の大域最小値を求める。
最小二乗法とカーブフィッティング
非線形最小二乗法
least_squares(fun, x0[, jac, bounds, …]) 変数境界付きの非線形最小二乗法問題を解く。
線形最小二乗法
nnls(A, b[, maxiter]) $x>=0$の条件で$ argmin_x || Ax - b ||_2 $を解く。
lsq_linear(A, b[, bounds, method, tol, …]) 変数境界付きの線形最小二乗法問題を解く。
カーブフィッティング
curve_fit(f, xdata, ydata[, p0, sigma, …]) 非線形最小二乗法を使って関数fをデータにフィットさせる。
求根
スカラー関数
root_scalar(f[, args, method, bracket, …]) スカラー関数の根を求める。
brentq(f, a, b[, args, xtol, rtol, maxiter, …]) ブレント法を使って分割区間の関数の根を求める。
brenth(f, a, b[, args, xtol, rtol, maxiter, …]) [a, b]でのfの根を求める。
ridder(f, a, b[, args, xtol, rtol, maxiter, …]) ある区間で関数の根を求める。
bisect(f, a, b[, args, xtol, rtol, maxiter, …]) ある区間で関数の根を求める。
newton(func, x0[, fprime, args, tol, …]) ニュートン・ラフソン法または割線法を使ってゼロを求める。
toms748 TOMSアルゴリズム748法を使ってゼロを求める。
RootResults(root, iterations, …) 球根の結果を表す。
root_scalar関数は次の方法をサポートします。
- root_scalar(method=’brentq’)
- root_scalar(method=’brenth’)
- root_scalar(method=’bisect’)
- root_scalar(method=’ridder’)
- root_scalar(method=’newton’)
- root_scalar(method=’toms748’)
- root_scalar(method=’secant’)
- root_scalar(method=’halley’)
下の表は、状況とそれに適した方法と合わせて、単純な根への収束を成功させるための反復ごと(および関数評価ごと)の漸近的な収束率を示しています。二分法はすべての中で最も遅く、関数評価ごとに1ビットの精度を加えますが、収束は保証されています。他の区間分割法はすべて(最終的に)関数評価ごとに正確なビット数を約50%増加させます。導関数ベースの方法は、すべてニュートン法に基づいていますが、初期値が根に近い場合はかなり速く収束します。また、複素平面(のサブセット)上に定義された関数にも適用できます。
fの定義域 | 範囲 | fprime | fprime2 | ソルバー | 収束の保証 | 速度(*) |
---|---|---|---|---|---|---|
R | Yes | bisection | Yes | 1 線形 | ||
brentq | Yes | >=1, <= 1.62 | ||||
brenth | Yes | >=1, <= 1.62 | ||||
ridder | Yes | 2.0 (1.41) | ||||
toms748 | Yes | 2.7 (1.65) | ||||
R または C | No | No | No | secant | 1.62 (1.62) | |
R または C | No | Yes | No | newton | 2.00 (1.41) | |
R または C | No | Yes | Yes | halley | 3.00 (1.44) |
関連情報
scipy.optimize.cython_optimize - 型付きCython版のzeros関数
不動点探索:
fixed_point(func, x0[, args, xtol, maxiter, …]) 関数の不動点を求める。
多次元
root(fun, x0[, args, method, jac, tol, …]) ベクトル関数の根を求める。
root関数は次の方法をサポートします。
- root(method=’hybr’)
- root(method=’lm’)
- root(method=’broyden1’)
- root(method=’broyden2’)
- root(method=’anderson’)
- root(method=’linearmixing’)
- root(method=’diagbroyden’)
- root(method=’excitingmixing’)
- root(method=’krylov’)
- root(method=’df-sane’)
線形計画法
linprog(c[, A_ub, b_ub, A_eq, b_eq, bounds, …]) 線形の等式・不等式拘束の条件において線形目的関数を最小化する。
linprog関数は次の方法をサポートします。
シンプレックス法は次のようなコールバック関数をサポートします。
linprog_verbose_callback(xk, **kwargs) linprogコールバックインターフェイスを実演するコールバック関数のサンプル。
割当問題:
linear_sum_assignment(cost_matrix) 線形和の割当問題を解く。
ユーティリティ
有限差分近似
approx_fprime(xk, f, epsilon, *args) スカラー関数の勾配の有限差分近似
check_grad(func, grad, x0, *args, **kwargs) 勾配の(前方)有限差分近似と比較して、勾配関数の正しさをチェックする。
直線探索
bracket(func[, xa, xb, args, grow_limit, …]) 関数の最小値の区間を抜き出す。
line_search(f, myfprime, xk, pk[, gfk, …]) 強ウルフ条件を満たすアルファを求める。
ヘッセ行列近似
LbfgsInvHessProduct(sk, yk) L-BFGS近似逆ヘッセ行列のための線形演算子
HessianUpdateStrategy ヘッセ行列更新戦略を実装するためのインターフェイス
ベンチマーク問題
rosen(x) ローゼンブロック関数
rosen_der(x) 導関数
rosen_hess(x) ローゼンブロック関数のヘッセ行列
rosen_hess_prod(x, p) ローゼンブロック関数のヘッセ行列とベクトルの積
レガシー関数
以下の最適化方法のインタフェースは、新しいスクリプトでの使用は非推奨です。これらの方法はすべて、上記の関数によって提供される新しく一貫性のあるインターフェースを介してアクセス可能です。