SciPy (á¡áá¶ááœáẠSai pie) ááẠNumpy Python ááá¯ážáá»á²á·ááŸá¯ááᯠá¡ááŒá±áá¶á áááºá¹áá»á¬ááá¯ááºáᬠá¡ááá®áá±ážááŸááºážá¡áá¯ááºáá áºáá¯ááŒá áºáááºá SciPy ááŒáá·áºá áááºáá¡ááŒááºá¡ááŸááºá¡áá»áá¯ážáááºáá±á¬ááºáá±á¬ Python á ááºááŸááºááẠMATLABá IDLá Octaveá R-Lab ááŸáá·áº SciLab ááá¯á·áá²á·ááá¯á· ááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá±áá¬áááá¹áá¶ááŸáá·áº ááŸá¯ááºááœá±ážáá±á¬ á áá áºáá¯á¶áá°ááá¯ááºááŒááºážáááºáááºážáá»áẠááŒá áºáá¬áá«áááºá ááá±á· áá»áœááºá¯ááºááẠscipy.optimize áááºáá±á·ááºá»ááœáẠáá°áááá»á¬ážáá±á¬ optimization algorithms á¡áá»áá¯á·ááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºááᯠá¡áá»ááºážáá»á¯á¶ážááŒá±á¬ááŒááá¯áá«áááºá áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠááá¯ááá¯á¡áá±ážá áááºááŒá®áž áá±á¬ááºáá¯á¶ážáá±á«áº á¡áá°á¡áá®ááᯠhelp() command ááᯠá¡áá¯á¶ážááŒá¯á ááá¯á·ááá¯áẠShift+Tab ááᯠá¡áá¯á¶ážááŒá¯á á¡ááŒá²áááºáž ááá°ááá¯ááºáá«áááºá
áááá«ááºáž
áááºááá¯ááºááá¯ááºááŸáá·áº áá°áááºážáááºážááŒá áºáá»á¬ážááᯠááŸá¬ááœá±áááºááŸá¯ááŒááºážá០áááºáááºáááºá¡ááœáẠáááºážáááºážáá»á¬ážá áá±á¬áºááŒáá»ááºáá»á¬ážááŸáá·áº ááá·áºááºáá»á¬ážááᯠá¡áááá¡á¬ážááŒáá·áº Wikipedia ááœááºááŸááá«áááºá á ááºážáá»ááºážá¡áá á€á¡áá»ááºá¡áááºááẠáá±áá¯áá»á ááºážáááºážáá»ááºáá»á¬ážááŸáá·áº áááºážááá¯á·ááá»áŸá±á¬ááºááœáŸá¬á¡ááœáẠá¡ááŒá±á¡áá±áá»á¬ážááᯠáá¬ážáááºááẠáá¯á¶áá±á¬ááºáá«áááºá áááºá¹áá»á¬áááºážáááºážáá»á¬ážá á¡ááŸá áºáá¬áááᯠáá¬ážáááºáááºá áá±á¬ááºážáá«ážáá áºáá¯á á®áá¡áá¯á¶ážááœáẠááá¯á·ááá¯áẠáááºááŸá áºáááºáá±á¬ ááŸá¬ááœá±áá±ážá¡ááºáá»ááºááœáẠááœá±á·ááŸáááá¯ááºááá·áº ááá¯ááá¯ááá¬ážáááºáá±á¬ áá¯ááºáá±ááŸá¯áá»á¬ážá ááá·áºááºáá»á¬ážááᯠááá¯ááºáá¬áá«á
ááá¯á·ááŒá±á¬áá·áºá scipy.optimize module ááœáẠá¡á±á¬ááºáá«áá¯ááºáá¯á¶ážáá¯ááºáááºážáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºáž áá«áááºáááºá
- á¡áá»áá¯ážáá»áá¯ážáá±á¬ algorithms (Nelder-Mead simplexá BFGSá Newton conjugate gradientsá
COBYLA ОSLSQP ) - ááá¹áá¬áá¯á¶ážááá¯ááºáᬠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºááŒááºáž (á¥ááá¬-
basinhopping ,ááœá²ááŒá¬ážááŸá¯_ááá·áºáá²ááŒá áºá áẠ) - á¡ááŒáœááºážá¡áá»ááºáá»á¬ážááᯠáá»áŸá±á¬á·áá»ááŒááºážá
MNC (á¡áááºážáá¯á¶áž_á áá¯áááºážáá»á¬áž) ááŸáá·áº áá»ááºážááœá±ážááá¯ááºáááºáá±á¬ á¡ááºáááá¯áá®áááºáá»á¬áž - variable áá áºáᯠ(minim_scalar) ááŸáá·áº roots (root_scalar) ááá¯ááŸá¬ááœá±ááŒááºáž
- á¡áá»áá¯ážáá»áá¯ážáá±á¬ algorithms (hybrid Powellá
Levenberg-Marquardt ááá¯á·ááá¯áẠááŒá®ážáá¬ážáá±á¬áááºážáááºážáá»á¬ážááŒá áºááá·áºNewton-Krylov ).
á€áá±á¬ááºážáá«ážááœáẠá€á á¬áááºážáá áºáá¯áá¯á¶ážá០ááááá¯á¶ážá¡ááŒá±á¬ááºážá¡áá¬ááá¯áᬠáá¯á¶ážáááºáá«áááºá
ááááºážááŸááºáá»á¬ážá áœá¬á á áá±ážáá¯ááºáá±á¬ááºáá»ááºááᯠááŒáœááºážáá»ááºáááŸá áá»áŸá±á¬á·áá»ááŒááºážá
scipy.optimize áááºáá±á·áá»áºá០á¡áááá·áºáá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºááẠááááºážááŸááºáá»á¬ážá áœá¬á á áá±ážáá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážá á¡ááŒá±á¡áá±ááá¯ááºáá¬ááŸáá·áº ááŒáœááºážáá»ááºáááŸá áá»áŸá±á¬á·áá»ááŒááºážááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážáááºá¡ááœáẠáá±áá°áá»áá»ááºááŸá¬ááŒááºááᯠáá±ážáá±á¬ááºáááºá áááºážá¡áá¯ááºáá¯ááºáá¯á¶ááᯠááá¯ááºááŒáááºá áá»áœááºá¯ááºááá¯á·ááẠááá°áá®áá±á¬áááºážáááºážáá»á¬ážááŒáá·áº áá±ážáááºá¡á±á¬ááºááŒá¯áá¯ááºááá·áº ááááºážááŸááºáá»á¬ážá áœá¬á ááá·áºáá»á±á¬áºáá±á¬áá¯ááºáá±á¬ááºáá»ááºáá áºáᯠááá¯á¡ááºáá«áááºá
á€áááºááœááºáá»ááºáá»á¬ážá¡ááœááºá N variable áá»á¬ážá Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááẠááŒá®ážááŒáá·áºá á¯á¶áááºá áá¯á¶á á¶áá«ááŸááá±á¬á
Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááŸáá·áº áááºážá Jacobi ááŸáá·áº Hessian áááºááá áºáá»á¬áž (áááááŸáá·áº áá¯ááá áááºážáááºáá¬ááŸá¯ á¡áá®ážáá®áž) ááᯠscipy.optimize áááºáá±á·áá»áºááœáẠáááºááŸááºáá¬ážááŒá®ážááŒá áºáá±á¬áºáááºáž áááºážááᯠáá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯áẠáááºááŸááºáá«áááºá
import numpy as np
def rosen(x):
"""The Rosenbrock function"""
return np.sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0, axis=0)
ááŸááºážáááºážáááºá¡ááœááºá ááááºážááŸááºááŸá áºáá¯á Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááááºááá¯ážáá»á¬ážááᯠ3D ááŒáá·áºááœá²ááŒáá·áºááŒáá«á áá¯á·á
áá¯ááºááœá²áááºá
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
# ÐаÑÑÑаОваеЌ 3D гÑаÑОк
fig = plt.figure(figsize=[15, 10])
ax = fig.gca(projection='3d')
# ÐаЎаеЌ ÑгПл ПбзПÑа
ax.view_init(45, 30)
# СПзЎаеЌ ЎаММÑе ÐŽÐ»Ñ Ð³ÑаÑОка
X = np.arange(-2, 2, 0.1)
Y = np.arange(-1, 3, 0.1)
X, Y = np.meshgrid(X, Y)
Z = rosen(np.array([X,Y]))
# РОÑÑеЌ пПвеÑÑ
МПÑÑÑ
surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm)
plt.show()
á¡áááá·áºáá¯á¶ážá 0 ááá¯áá¬ááᯠááŒáá¯áááá¬ážááááºá á¡áá»áá¯ážáá»áá¯ážáá±á¬ scipy.optimize áá¯ááºáá¯á¶ážáá¯ááºáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á Rosenbrock áá¯ááºáá±á¬ááºáá»ááºá á¡áááºážáá¯á¶ážáááºááá¯ážááᯠáá¯á¶ážááŒááºáááºážááá°áá¬áá»á¬ážááᯠááŒáá·áºááŒáá«á áá¯á·á
Nelder-Mead ááá¯ážááŸááºážáá±á¬áááºážáááºáž
0-dimensional space ááœáẠáááŠážá¡ááŸáẠx5 ááŸááá«á
á±á á¡ááºáááá¯áá®áááºááᯠá¡áá¯á¶ážááŒá¯á Rosenbrock áá¯ááºáá±á¬ááºáá»ááºá á¡áááá·áºáá¯á¶ážá¡ááŸááºááᯠááŸá¬ááŒáá·áºááŒáá«á
áá¯á·
from scipy.optimize import minimize
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead',
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 339
Function evaluations: 571
[1. 1. 1. 1. 1.]
ááá¯ážááŸááºážáá±á¬áááºážáááºážááẠááŸááºážáááºážááŒááºáá¬ážá áœá¬áááºááŸááºáá¬ážááŒá®áž áá»áŸáá»áŸáááá»á±á¬ááœá±á·áá±á¬áá¯ááºáá±á¬ááºáá»ááºááᯠáá»áŸá±á¬á·áá»ááẠá¡ááá¯ážááŸááºážáá¯á¶ážáááºážáááºážááŒá áºáááºá áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯á áááºážáááºáá¬ááŸá¯ááᯠááœááºáá»ááºááẠáááá¯á¡ááºáá«á áááºážááẠáááºážááááºááá¯ážáá»á¬ážááá¯áᬠáááºááŸááºááẠáá¯á¶áá±á¬ááºáá«áááºá Nelder-Mead áááºážáááºážááẠááá¯ážááŸááºážáá±á¬ ááŒá¿áá¬áá»á¬ážááᯠáááºážáá«ážá¡á±á¬ááºááŒá¯áá¯ááºááẠááœá±ážáá»ááºááŸá¯áá±á¬ááºážáá áºáá¯ááŒá áºáááºá ááá¯á·áá±á¬áºá áááºážááẠgradient ááá·áºááŸááºážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážáááŒá¯áá±á¬ááŒá±á¬áá·áº á¡áááá·áºáá¯á¶ážááá¯ááŸá¬ááœá±ááẠá¡áá»áááºááá¯ááŒá¬ááá¯ááºáááºá
Powell áááºážáááºáž
áá¯ááºáá±á¬ááºáá»ááºáááºááá¯ážáá»á¬ážááá¯áᬠááœááºáá»ááºááá·áº á¡ááŒá¬áž optimization algorithm áá
áºáá¯ááŒá
áºáááºá
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='powell',
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 1622
[1. 1. 1. 1. 1.]
Broyden-Fletcher-Goldfarb-Shanno (BFGS) algorithm
á¡ááŒá±áá
áºáá¯áá®ááá¯á· áá»ááºááŒááºá
áœá¬áá±á«ááºážá
ááºážááŸá¯áááŸááááºá áá¯ááºáá¯á¶ážáá¯ááºáááºáž
Rosenbrock áá¯ááºáá±á¬ááºáá»ááºá áááºážáááºáá¬ááŒááºážááᯠááœá²ááŒááºážá áááºááŒá¬ááŸá¯áá¯á¶á á¶ááŒáá·áº ááŸá¬ááœá±ááŒáá«á áá¯á·á
á€á áá¬ážáááºááẠáááááŸáá·áº áá±á¬ááºáá¯á¶ážááŸááœá²á ááááºážááŸááºá¡á¬ážáá¯á¶ážá áááºážáááºáá¬ááŒááºážá¡ááœáẠá¡áá»á¯á¶ážáááºáááºá
ဠgradient ááá¯ááœááºáá»ááºááá·áº Python áá¯ááºáá±á¬ááºáá»ááºááᯠááŒáá·áºááŒáá«á áá¯á·á
def rosen_der (x):
xm = x [1: -1]
xm_m1 = x [: - 2]
xm_p1 = x [2:]
der = np.zeros_like (x)
der [1: -1] = 200 * (xm-xm_m1 ** 2) - 400 * (xm_p1 - xm ** 2) * xm - 2 * (1-xm)
der [0] = -400 * x [0] * (x [1] -x [0] ** 2) - 2 * (1-x [0])
der [-1] = 200 * (x [-1] -x [-2] ** 2)
return der
á¡á±á¬ááºáá±á¬áºááŒáá«á¡ááá¯ááºáž á¡áááá·áºáá¯á¶ážáá¯ááºáá±á¬ááºáá»ááºá jac áá±á¬ááºááááºááá¯ážá¡ááŒá Ạgradient ááœááºáá»ááºááŸá¯áá¯ááºáá±á¬ááºáá»ááºááᯠáááºááŸááºáá¬ážáááºá
res = minimize(rosen, x0, method='BFGS', jac=rosen_der, options={'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 25
Function evaluations: 30
Gradient evaluations: 30
[1.00000004 1.0000001 1.00000021 1.00000044 1.00000092]
Conjugate gradient algorithm (ááá°áááº)
algorithm ááá¯
ááá°áááºááááºážáááºážááẠáá±áá§áááá¬áá
áºáá¯á¡ááœááºáž áá¯ááºáá±á¬ááºáá»ááºáá
áºáá¯á¡á¬áž áá¯ááááá®ááá®á polynomial ááŒáá·áº ááá·áºááŸááºážááŒááºážá¡áá±á«áº á¡ááŒá±áá¶áááºá
áááºááŸá¬ áá¯ááá áááºážáááºáá¬áá±á¬ áááºááá
Ạ(Hessian matrixá Hessian)á
Hessian ááẠá¡ááŒá¯ááá±á¬áá±á¬ááºáá±á¬ á¡ááá¡áá»ááŒá
áºáá«áá áá±ážáá±á¬áá·áºáá¯á¶ááá¹áá¬ááºá áá¯á Gradient ááᯠáá¯áá០áá¯áá¡áá áá®áá»áŸááŒááºážááŒáá·áº á€áá¯ááºáá±á¬ááºáá»ááºá áá±áááá¯ááºáᬠá¡áááá·áºáá¯á¶ážááᯠááŸá¬ááœá±á·ááá¯ááºáá«áááºá ááááºááẠá
áá¬ážáááºááŒá
áºáááºá
Inverse Hessian ááᯠconjugate gradient method ááŒáá·áº ááœááºáá»ááºáááºá Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááᯠáá»áŸá±á¬á·áá»ááẠá€áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá á¥ááá¬ááᯠá¡á±á¬ááºááœáẠáá±á¬áºááŒáá¬ážáááºá Newton-CG áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áááºá áááºááẠHessian ááᯠááœááºáá»ááºááá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáááºááŸááºááá«áááºá
ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá¯á¶á
á¶ááœáẠHessian of the Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááẠáá®áá»áŸáááº-
áááºááŸá¬ О á matrix ááá¯áááºááŸááºáá«á .
matrix á áá»ááºááŸááá±á¬ áá¯áááá¯ááºáá±á¬ááŒááºá ááºáá»á¬ážááẠáá°áá®áááº-
á¥ááá¬á¡á¬ážááŒáá·áºá áá«ážáááºááŒáẠá¡á¬áá¬á N=5 ááœáẠRosenbrock áá¯ááºáá±á¬ááºáá»ááºá¡ááœáẠHessian matrix ááẠáá®ážááá¯ááºážáá¯á¶á ᶠááŸááááº-
ဠHessian ááᯠááœááºáá»ááºáá±á¬ áá¯ááºááŸáá·áºá¡áá° Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááᯠáá»áŸá±á¬á·áááºážá á±ááẠáá¯ááºááŒáá·áº áá±á«ááºážá ááºáá¬ážáá±á¬ gradient (ááá°áááº) áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯áááº-
def rosen_hess(x):
x = np.asarray(x)
H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
diagonal = np.zeros_like(x)
diagonal[0] = 1200*x[0]**2-400*x[1]+2
diagonal[-1] = 200
diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
H = H + np.diag(diagonal)
return H
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hess=rosen_hess,
options={'xtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 24
[1. 1. 1. 0.99999999 0.99999999]
Hessian á áá¯ááºáá¯ááºáá¯ááºáááºážáá±á¬ááºáá¬á á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááŸáá·áº áááá¬ážáá±á¬ vector áá áºáá¯
áááºááœá±á·ááá¹áá¬ááŒá¿áá¬áá»á¬ážááœáẠHessian matrix áá áºáá¯áá¯á¶ážááᯠááœááºáá»ááºááŒááºážááŸáá·áº ááááºážáááºážááŒááºážááẠáááá¬áááºááŸá¬ážáá±á¬ á¡áá»áááºááŸáá·áº ááŸááºáá¬ááºá¡áááºážá¡ááŒá áºáá»á¬áž ááá¯á¡ááºáá«áááºá á€ááá á¹á ááœááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº Hessian matrix ááá¯ááºááá¯ááºáááºááŸááºáááºáááá¯á¡ááºáá«á á¡áááá·áºáá¯á¶ážáá¯ááºáá¯á¶ážáá¯ááºáááºážááẠá¡ááŒá¬ážááá¯ááºáá±á¬ vector ááŒáá·áº Hessian á áá¯ááºáá¯ááºááŸáá·áº áá®áá»áŸáá±á¬ vector áá áºáá¯áᬠááá¯á¡ááºáááºá ááá¯á·ááŒá±á¬áá·áºá ááœááºááŒá°áá¬ááŸá¯áá±á¬áá·áºááŸááŒáá·áºáá»áŸáẠHessian áá¯ááºáá¯ááºáááááºááᯠááááºáááᯠvector ááŒáá·áº ááŒááºáá±ážááá·áº áá¯ááºáá±á¬ááºáá»ááºááᯠáá»ááºáá»ááºážáááºááŸááºááẠááá¯ááá¯áá±á¬ááºážááœááºáá«áááºá
áááá¡ááŒááºážá¡áá¯á¶á¡ááŒá Ạminimization vector ááá¯áá°áá±á¬ááºááá·áº hess function ááŸáá·áº áá¯áááá¡ááŒááºážá¡áá¯á¶á¡ááŒá Ạarbitrary vector ( minimized áá¯ááºááẠfunction áá¡ááŒá¬áž argument áá»á¬ážááŸáá·áºá¡áá°) á áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá Hessian of the Rosenbrock áá¯ááºáá±á¬ááºáá»ááºá áá¯ááºáá¯ááºááᯠááŸá¬ážááœááºážáá±á¬ vector ááŒáá·áº ááœááºáá»ááºáááºááŸá¬ á¡ááœááºáááºáá²áááºááá¯ááºáá«á á¡áááºááá¯á· p áááá¬ážáá±á¬ vector áá áºáá¯ááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠáá¯ááºáá¯ááºááŒá áºáááºá áá¯á¶áááº-
Hessian á áá¯ááºáá¯ááºááᯠááœááºáá»ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºááŸáá·áº ááááºááŸááºáá¬ážáá±á¬ vector áá áºáá¯ááᯠá¡áááá·áºáá¯á¶áž áá¯ááºáá±á¬ááºááŸá¯ááá¯á· hessp á¡ááŒá±á¬ááºážááŒáá»ááºá áááºááá¯ážá¡ááŒá ẠááŒááºááœá¬ážáááº-
def rosen_hess_p(x, p):
x = np.asarray(x)
Hp = np.zeros_like(x)
Hp[0] = (1200*x[0]**2 - 400*x[1] + 2)*p[0] - 400*x[0]*p[1]
Hp[1:-1] = -400*x[:-2]*p[:-2]+(202+1200*x[1:-1]**2-400*x[2:])*p[1:-1]
-400*x[1:-1]*p[2:]
Hp[-1] = -400*x[-2]*p[-2] + 200*p[-1]
return Hp
res = minimize(rosen, x0, method='Newton-CG',
jac=rosen_der, hessp=rosen_hess_p,
options={'xtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 24
Function evaluations: 33
Gradient evaluations: 56
Hessian evaluations: 66
Conjugate gradient trust region algorithm (Newton)
Hessian matrix á áá¶á·áá»ááºážáá±á¬á¡á±ážá
ááºááŸá¯ááŸáá·áº ááŸá¬ážááœááºážáá±á¬ááŸá¬ááœá±ááŸá¯áááºážááœáŸááºáá»ááºáá»á¬ážááẠNewton á conjugate gradient algorithm ááᯠáááá±á¬ááºááŸá¯áááŸáá
á±áá«á ááá¯ááá¯á·áá±á¬ á¡ááŒá±á¡áá±áá»áá¯ážááœáẠáŠážá
á¬ážáá±ážáááºá
Hessian matrix áá¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááŸáá·áº á¥ááá¬-
res = minimize(rosen, x0, method='trust-ncg',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 20
Function evaluations: 21
Gradient evaluations: 20
Hessian evaluations: 19
[1. 1. 1. 1. 1.]
Hessian á áá¯ááºáá¯ááºáá¯ááºáá±á¬ááºáá»ááºááŸáá·áº áááá¬ážáá±á¬ vector ááŸáá·áº á¥ááá¬-
res = minimize(rosen, x0, method='trust-ncg',
jac=rosen_der, hessp=rosen_hess_p,
options={'gtol': 1e-8, 'disp': True})
print(res.x)
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 20
Function evaluations: 21
Gradient evaluations: 20
Hessian evaluations: 0
[1. 1. 1. 1. 1.]
Krylov á¡áá»áá¯ážá¡á á¬ážáááºážáááºážáá»á¬áž
áá¯á¶ááŒááºá
áááºáá»ááá±á¬ ncg áááºážáááºážáá²á·ááá¯á·áááºá Krylov-type áááºážáááºážáá»á¬ážááẠmatrix-vector áá¯ááºáá¯ááºáá»á¬ážááá¯áᬠá¡áá¯á¶ážááŒá¯áá±á¬ááŒá±á¬áá·áº ááŒá®ážáá¬ážáá±á¬ááŒá¿áá¬áá»á¬ážááᯠááŒá±ááŸááºážáááºá¡ááœáẠáá±á¬ááºážááœááºááá·áºáá»á±á¬áºáá«áááºá áááºážááá¯á·á á¡ááŸá
áºáá¬áááŸá¬ ááŒááºáá±á¬ááºáá¬ážáá±á¬ Krylov áá±áá¬ááœá²á០ááá·áºáááºáá¬ážáá±á¬ áá¯á¶ááŒááºááŸá¯áááºááŒá±áá
áºáá¯ááœáẠááŒá¿áá¬áá
áºáá¯ááᯠááŒá±ááŸááºážáááºááŒá
áºáááºá ááá±áá»á¬áá±á¬ááŒá¿áá¬áá»á¬ážá¡ááœááºá áá¯á¶ááŒááºá
áááºáá»ááá±á¬-ncg áááºážáááºážááŸáá·áº ááŸáá¯ááºážááŸááºáá«á ááŒá¿áá¬ááœá²áá
áºáá¯á¡ááœáẠmatrix-vector áá¯ááºáá¯ááºá¡áá±á¡ááœáẠáááºážáá«ážááŒááºážááŒá±á¬áá·áº áááºážááẠááá¯ááºážááá¯ááºáá±á¬ áááºááŒááºážá¡áá±á¡ááœáẠáááºážáá«ážáá±á¬ááŒá±á¬áá·áº á€áááºážáááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá ááá¯áá±á¬ááºážáá«áááºá ááá¯á·á¡ááŒááºá quadratic subproblem áá¡ááŒá±ááẠtrust-ncg method ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážáááºááá¯ááá¯áááá»á
áœá¬ááœá±á·ááŸáááááºá
Hessian matrix áá¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºááŸáá·áº á¥ááá¬-
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 18
print(res.x)
[1. 1. 1. 1. 1.]
Hessian á áá¯ááºáá¯ááºáá¯ááºáá±á¬ááºáá»ááºááŸáá·áº áááá¬ážáá±á¬ vector ááŸáá·áº á¥ááá¬-
res = minimize(rosen, x0, method='trust-krylov',
jac=rosen_der, hessp=rosen_hess_p,
options={'gtol': 1e-8, 'disp': True})
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 19
Function evaluations: 20
Gradient evaluations: 20
Hessian evaluations: 0
print(res.x)
[1. 1. 1. 1. 1.]
áá¯á¶ááŒááºááŸá¯áááºááŒá±ááŸá á¡áá®ážá ááºáá¯á¶ážá¡ááŒá±á¡ááœáẠá¡ááºáááá¯áá®áááº
áááºážáááºážá¡á¬ážáá¯á¶áž (Newton-CGá trust-ncg ááŸáá·áº trust-krylov) ááẠááŒá®ážáá¬ážáá±á¬ááŒá¿áá¬áá»á¬áž (ááááºážááŸááºáá±á«ááºáž áá±á¬ááºáá»á®ááŸááá±á¬) ááá¯ááŒá±ááŸááºážáááºá¡ááœáẠáá±á¬ááºážááœááºááá·áºáá»á±á¬áºáá«áááºá áááºážááẠá¡áááºážáá¶áá±á«ááºážá ááºáá¬ážáá±á¬ gradient algorithm ááẠááŒá±á¬ááºážááŒáẠHessian matrix á á¡áá®ážá ááºáá¯á¶áž á¡áá¯á¶ážá¡ááŒááºááᯠá¡áááá¹áá¬ááºáááºáá±á¬ááºá á±áá±á¬ááŒá±á¬áá·áºááŒá áºáááºá Hessian á ááŸááºážáááºážááŒááºáá¬ážá áœá¬ áá»á²á·ááœááºááŒááºážáááŸááá² á¡áááºáááºá¡áá«áá« ááŒá±ááŸááºážáá»ááºááᯠááœá±á·ááŸáááááºá Hessian ááŸáá·áº áááá¬ážáá±á¬ vector á áá¯ááºáá¯ááºá¡ááœáẠáá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááᯠáááºáááºááŸááºáááºáᬠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áºá ဠalgorithm ááẠsparse (band diagonal) matrices ááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡áá°ážáá±á¬ááºážááœááºáá«áááºá áááºážááẠááŸááºáá¬ááºáá¯ááºáá»á ááááºáááºážáá«ážááŒá®áž á¡áá»áááºáá¯ááºáááºáá¬á á±áááºá
á¡áááºá á¬áž ááŒá¿áá¬áá»á¬ážá¡ááœááºá Hessian ááᯠááá¯ááŸá±á¬ááºááŒááºážááŸáá·áº áááºáááºááŒááºážá¡ááœáẠáá¯ááºáá»á ááááºááẠáá áá¯ážááááºááá«á ááá¯ááá¯áááºááŸá¬ áá¯á¶ááŒááºááŸá¯áááºááŒá±á ááŒá¿áá¬ááœá²áá»á¬ážááᯠá¡ááá¡áá»áá®ážáá«áž á¡ááá¡áá»áá®ážáá«áž á¡ááŒáááºáá± á¡áááºážáááºáá»áŸááŒáá·áº ááŒá±ááŸááºážááá¯ááºáááºáᯠááá¯ááá¯áááºá áá«ááá¯áá¯ááºááá¯á·á á¡áá»áá¯á·áá±á¬ áá»ááºážááá®áá»áŸááŒááºážáá»á¬ážááᯠáá±ážáá±á¬áá·áºáá¯á¶ááŒá¿áá¬áá áºáá¯á á®á¡ááœáẠáááºáá«ááá²áá² ááŒá±ááŸááºážáááºá ááá¯ááá¯á·áá±á¬á¡ááŒá±áá áºáá¯ááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº Hessian matrix á Cholesky ááŒáá¯ááœá²ááŸá¯ 3 ááá¯á·ááá¯áẠ4 ááá¯á¡ááºáááºá ááááºá¡áá±ááŒáá·áºá áááºážáááºážááẠáááºáá«áááºáá«ááŒá¯áá¯ááºááŸá¯áááºážáá«ážááŒá®áž áá±á«ááºážá ááºáá¯ááºáá±á¬ááºááŒá®áž á¡ááŒá¬ážáá¯á¶ááŒááºá áááºáá»ááá±á¬áá±ááááºážáááºážáá»á¬ážááẠáááºááŸááºážáá»ááºááá¯ááºáá¬áá¯ááºáá±á¬ááºááŸá¯ááœááºáá»ááºááŸá¯áá»á¬ážááᯠá¡áááºážáááºááá¯á¡ááºáááºá á€á¡ááºáááá¯áá®áááºááœáẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ Hessian áááºááá áºááᯠáá¯á¶ážááŒááºááŒááºážááœááºáᬠáá«áááºááŒá®áž Hessian á áá¯ááºáá¯ááºáá¯ááºáá±á¬ááºáá»ááºááŸáá·áº áááá¬ážáá±á¬ vector ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºá áœááºážááᯠááá¶á·ááá¯ážáá«á
Rosenbrock áá¯ááºáá±á¬ááºáá»ááºááᯠáá»áŸá±á¬á·áá»ááŒááºážááŒáá·áº á¥ááá¬-
res = minimize(rosen, x0, method='trust-exact',
jac=rosen_der, hess=rosen_hess,
options={'gtol': 1e-8, 'disp': True})
res.x
Optimization terminated successfully.
Current function value: 0.000000
Iterations: 13
Function evaluations: 14
Gradient evaluations: 13
Hessian evaluations: 14
array([1., 1., 1., 1., 1.])
áá«ááá¯á·á¡á²áá®ááŸá¬áááºáá±áááá·áºáááºá áá±á¬ááºáá±á¬ááºážáá«ážááœáẠá¡ááŒá±á¡áá±á¡ááá¯áẠáá»áŸá±á¬á·áá»ááŒááºážááá¯ááºáᬠá áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶ážá¡áá¬áá»á¬ážá á¡áá®ážá ááºáá¯á¶ážááŒá¿áá¬áá»á¬ážááá¯ááŒá±ááŸááºážáá¬ááœáẠáááºážáá«ážá¡á±á¬ááºá¡áá¯á¶ážáá»ááŒááºážá ááááºážááŸááºáá áºáá¯ááá¯ááºáá±á¬ááºáá»ááºááᯠáááºážáá«ážá¡á±á¬ááºááŒá¯áá¯ááºááŒááºážá ááááºáááᯠminimizer áá»á¬ážááŸáá·áº scipy.optimize ááá¯á¡áá¯á¶ážááŒá¯á áá®áá»áŸááŒááºážá áá áºáá¡ááŒá áºáá»á¬ážááá¯ááŸá¬ááœá±ááŒááºážá¡ááŒá±á¬ááºáž áá±á¬ááºáá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááŒá±á¬ááŒáá«áááºá á¡áá¯ááºá
source:
source: www.habr.com