最佳化與尋根 (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, ...])

單個或多個變數的純量函數的最小化。

minimize 函數支援以下方法

約束條件作為單個物件或來自以下類別的物件列表傳遞給 minimize 函數

NonlinearConstraint(fun, lb, ub[, jac, ...])

變數的非線性約束。

LinearConstraint(A[, lb, ub, keep_feasible])

變數的線性約束。

簡單邊界約束會單獨處理,並且有一個特殊的類別用於它們

Bounds([lb, ub, keep_feasible])

變數的邊界約束。

實作 HessianUpdateStrategy 介面的擬牛頓策略可用於近似 minimize 函數中的 Hessian(僅適用於 ‘trust-constr’ 方法)。實作此介面的可用擬牛頓方法有

BFGS([exception_strategy, min_curvature, ...])

Broyden-Fletcher-Goldfarb-Shanno (BFGS) Hessian 更新策略。

SR1([min_denominator, init_scale])

對稱秩 1 Hessian 更新策略。

全域最佳化#

basinhopping(func, x0[, niter, T, stepsize, ...])

使用盆地跳躍演算法尋找函數的全域最小值。

brute(func, ranges[, args, Ns, full_output, ...])

通過暴力窮舉在給定範圍內最小化函數。

differential_evolution(func, bounds[, args, ...])

尋找多元函數的全域最小值。

shgo(func, bounds[, args, constraints, n, ...])

使用 SHG 最佳化尋找函數的全域最小值。

dual_annealing(func, bounds[, args, ...])

使用雙重退火尋找函數的全域最小值。

direct(func, bounds, *[, args, eps, maxfun, ...])

使用 DIRECT 演算法尋找函數的全域最小值。

最小平方與曲線擬合#

非線性最小平方#

least_squares(fun, x0[, jac, bounds, ...])

求解具有變數邊界的非線性最小平方問題。

線性最小平方#

nnls(A, b[, maxiter, atol])

求解 argmin_x || Ax - b ||_2,其中 x>=0

lsq_linear(A, b[, bounds, method, tol, ...])

求解具有變數邊界的線性最小平方問題。

isotonic_regression(y, *[, weights, increasing])

非參數等張回歸。

曲線擬合#

curve_fit(f, xdata, ydata[, p0, sigma, ...])

使用非線性最小平方將函數 f 擬合到數據。

尋根#

純量函數#

root_scalar(f[, args, method, bracket, ...])

尋找純量函數的根。

brentq(f, a, b[, args, xtol, rtol, maxiter, ...])

使用 Brent 方法在括號區間中尋找函數的根。

brenth(f, a, b[, args, xtol, rtol, maxiter, ...])

使用帶有雙曲線外推的 Brent 方法在括號區間中尋找函數的根。

ridder(f, a, b[, args, xtol, rtol, maxiter, ...])

使用 Ridder 方法在區間中尋找函數的根。

bisect(f, a, b[, args, xtol, rtol, maxiter, ...])

使用二分法在區間內尋找函數的根。

newton(func, x0[, fprime, args, tol, ...])

使用牛頓-拉弗森(或正割或哈雷)方法尋找實數或複數函數的根。

toms748(f, a, b[, args, k, xtol, rtol, ...])

使用 TOMS 演算法 748 方法尋找根。

RootResults(root, iterations, ...)

表示尋根結果。

root_scalar 函數支援以下方法

下表列出了情況和適當的方法,以及每次迭代(和每次函數評估)的漸近收斂速率,以成功收斂到簡單根 (*)。二分法是其中最慢的方法,每次函數評估增加一位準確性,但保證收斂。其他括號方法都(最終)為每次函數評估將準確位數增加約 50%。基於導數的方法,都建立在 newton 之上,如果初始值接近根,則可以非常快速地收斂。它們也可以應用於在複數平面(的子集)上定義的函數。

f 的域

括號?

導數?

求解器

收斂

fprime

fprime2

保證?

速率 (*)

R

不適用

不適用

  • 二分法

  • brentq

  • brenth

  • ridder

  • toms748

  • 1 “線性”

  • >=1, <= 1.62

  • >=1, <= 1.62

  • 2.0 (1.41)

  • 2.7 (1.65)

RC

正割法

1.62 (1.62)

RC

牛頓法

2.00 (1.41)

RC

哈雷法

3.00 (1.44)

另請參閱

scipy.optimize.cython_optimize – 尋根函數的類型化 Cython 版本

不動點尋找

fixed_point(func, x0[, args, xtol, maxiter, ...])

尋找函數的不動點。

多維#

root(fun, x0[, args, method, jac, tol, ...])

尋找向量函數的根。

root 函數支援以下方法

逐元素最小化和尋根#

線性規劃 / MILP#

milp(c, *[, integrality, bounds, ...])

混合整數線性規劃

linprog(c[, A_ub, b_ub, A_eq, b_eq, bounds, ...])

線性規劃:最小化受線性等式和不等式約束的線性目標函數。

linprog 函數支援以下方法

單純形法、內點法和修正單純形法支援回呼函數,例如

linprog_verbose_callback(res)

一個示範 linprog 回呼介面的範例回呼函數。

指派問題#

linear_sum_assignment

解決線性總和指派問題。

quadratic_assignment(A, B[, method, options])

近似二次指派問題和圖形匹配問題的解。

quadratic_assignment 函數支援以下方法

工具#

有限差分近似#

approx_fprime(xk, f[, epsilon])

純量或向量值函數導數的有限差分近似。

check_grad(func, grad, x0, *args[, epsilon, ...])

通過將梯度函數與梯度的(前向)有限差分近似值進行比較,來檢查梯度函數的正確性。

Hessian 近似#

LbfgsInvHessProduct(*args, **kwargs)

L-BFGS 近似逆 Hessian 的線性運算子。

HessianUpdateStrategy()

用於實作 Hessian 更新策略的介面。

基準問題#

rosen(x)

Rosenbrock 函數。

rosen_der(x)

Rosenbrock 函數的導數(即梯度)。

rosen_hess(x)

Rosenbrock 函數的 Hessian 矩陣。

rosen_hess_prod(x, p)

Rosenbrock 函數的 Hessian 矩陣與向量的乘積。

舊版函數#

不建議在新腳本中使用以下函數;所有這些方法都可以通過更新、更一致的介面訪問,這些介面由上面的介面提供。

最佳化#

通用多元方法

fmin(func, x0[, args, xtol, ftol, maxiter, ...])

使用下坡單純形演算法最小化函數。

fmin_powell(func, x0[, args, xtol, ftol, ...])

使用修改後的 Powell 方法最小化函數。

fmin_cg(f, x0[, fprime, args, gtol, norm, ...])

使用非線性共軛梯度演算法最小化函數。

fmin_bfgs(f, x0[, fprime, args, gtol, norm, ...])

使用 BFGS 演算法最小化函數。

fmin_ncg(f, x0, fprime[, fhess_p, fhess, ...])

使用牛頓-CG 方法對函數進行無約束最小化。

約束多元方法

fmin_l_bfgs_b(func, x0[, fprime, args, ...])

使用 L-BFGS-B 演算法最小化函數 func。

fmin_tnc(func, x0[, fprime, args, ...])

使用截斷牛頓演算法,在變數受邊界約束的情況下最小化函數。

fmin_cobyla(func, x0, cons[, args, ...])

使用線性近似約束最佳化 (COBYLA) 方法最小化函數。

fmin_slsqp(func, x0[, eqcons, f_eqcons, ...])

使用循序最小平方規劃最小化函數

單變數(純量)最小化方法

fminbound(func, x1, x2[, args, xtol, ...])

純量函數的有界最小化。

brent(func[, args, brack, tol, full_output, ...])

給定一個單變數函數和一個可能的括號,傳回函數的局部最小值,該最小值被隔離到 tol 的分數精度。

golden(func[, args, brack, tol, ...])

使用黃金分割法傳回單變數函數的最小值。

最小平方#

leastsq(func, x0[, args, Dfun, full_output, ...])

最小化一組方程式的平方和。

尋根#

通用非線性求解器

fsolve(func, x0[, args, fprime, ...])

尋找函數的根。

broyden1(F, xin[, iter, alpha, ...])

使用 Broyden 的第一種雅可比矩陣近似值尋找函數的根。

broyden2(F, xin[, iter, alpha, ...])

使用 Broyden 的第二種雅可比矩陣近似值尋找函數的根。

NoConvergence

當非線性求解器在指定的 maxiter 內未能收斂時引發的例外。

大規模非線性求解器

newton_krylov(F, xin[, iter, rdiff, method, ...])

使用 Krylov 近似逆雅可比矩陣尋找函數的根。

anderson(F, xin[, iter, alpha, w0, M, ...])

使用(擴展的)Anderson 混合尋找函數的根。

BroydenFirst([alpha, reduction_method, max_rank])

使用 Broyden 的第一種雅可比矩陣近似值尋找函數的根。

InverseJacobian(jacobian)

一個簡單的包裝器,使用 solve 方法反轉雅可比矩陣。

KrylovJacobian([rdiff, method, ...])

使用 Krylov 近似逆雅可比矩陣尋找函數的根。

簡單迭代求解器

excitingmixing(F, xin[, iter, alpha, ...])

使用調整後的對角雅可比矩陣近似值尋找函數的根。

linearmixing(F, xin[, iter, alpha, verbose, ...])

使用純量雅可比矩陣近似值尋找函數的根。

diagbroyden(F, xin[, iter, alpha, verbose, ...])

使用對角 Broyden 雅可比矩陣近似值尋找函數的根。