LoginSignup
35
33

More than 3 years have passed since last update.

SciPyリファレンス scipy.optimize 日本語訳

Last updated at Posted at 2018-06-08

英語版

Optimization and root finding (scipy.optimize) — SciPy v1.3.0 Reference Guide

参考リンク

非線形最適化関数 — 機械学習の Python との出会い

最適化と求根 (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関数に渡されます。

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関数は次の方法をサポートします。

下の表は、状況とそれに適した方法と合わせて、単純な根への収束を成功させるための反復ごと(および関数評価ごと)の漸近的な収束率を示しています。二分法はすべての中で最も遅く、関数評価ごとに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関数は次の方法をサポートします。

線形計画法

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) ローゼンブロック関数のヘッセ行列とベクトルの積

レガシー関数

以下の最適化方法のインタフェースは、新しいスクリプトでの使用は非推奨です。これらの方法はすべて、上記の関数によって提供される新しく一貫性のあるインターフェースを介してアクセス可能です。

最適化

汎用多変数法:

fmin(func, x0[, args, xtol, ftol, maxiter, …])
fmin_powell(func, x0[, args, xtol, ftol, …])
fmin_cg(f, x0[, fprime, args, gtol, norm, …])
fmin_bfgs(f, x0[, fprime, args, gtol, norm, …])
fmin_ncg(f, x0, fprime[, fhess_p, fhess, …])

制約付き多変数法:

fmin_l_bfgs_b(func, x0[, fprime, args, …])
fmin_tnc(func, x0[, fprime, args, …])
fmin_cobyla(func, x0, cons[, args, …])
fmin_slsqp(func, x0[, eqcons, f_eqcons, …])
differential_evolution(func, bounds[, args, …])

単変数(スカラー)最小化法:

fminbound(func, x1, x2[, args, xtol, …])
brent(func[, args, brack, tol, full_output, …])
golden(func[, args, brack, tol, …])

最小二乗法

leastsq(func, x0[, args, Dfun, full_output, …]) 方程式セットの平方和を最小化する。

球根

一般非線形ソルバー:

fsolve(func, x0[, args, fprime, …]) 関数の根を求める。
broyden1(F, xin[, iter, alpha, …]) ブロイデンの1次ヤコビ行列近似を使って関数の根を求める。
broyden2(F, xin[, iter, alpha, …]) ブロイデンの2次ヤコビ行列近似を使って関数の根を求める。

大規模非線形ソルバー:

newton_krylov(F, xin[, iter, rdiff, method, …]) 逆ヤコビ行列のクリロフ近似を使って関数を根を求める。
anderson(F, xin[, iter, alpha, w0, M, …]) (拡張)アンダーソン混合を使って関数の根を求める。

単純反復:

excitingmixing(F, xin[, iter, alpha, …]) 調整対角ヤコビ行列近似を使って関数の根を求める。
linearmixing(F, xin[, iter, alpha, verbose, …]) スカラーヤコビ行列近似を使って関数の根を求める。
diagbroyden(F, xin[, iter, alpha, verbose, …]) 対角ブロイデンヤコビ行列近似を使って関数の根を求める。

非線形ソルバーの追加情報

35
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
33