SciPy (sai pai ááŁáá) á Numpy Python á áĽáŤ áá á¨á°áá°á¨á° á¨ááłáĽ áá°áá áŞáŤ áĽá á ááᢠá SciPyᣠá ááá°ááá á¨áááá ááá áá áĽáá° MATLABᣠIDLᣠOctaveᣠR-Lab áĽá SciLab á°ááłáłá á¨á°áá á¨ááἠáá°áľ áĽá ááľáĽáľáĽ á¨ááŽáśáłáá á áŤáŁá˘ ááááᢠáᏠá scipy.optimize áĽá á ááľáĽ á ááłááľ á¨áłáá á¨áááťá¸áľ áľáá° áááŽá˝á áĽáá´áľ á°ááŁáŤá ááľá¨á áĽááłááĽá á á áአáááá áĽáááááᢠá°ááŁáŤáľá áľááá áá á¨á áá áááá áĽá áá áłá áĽáá áá áá á¨áĽáá() áľáááá á áá áá ááá Shift+Tabá á áá áá ááááľ ááťááá˘
ááá˘áŤ
áĽáŤá´á áĽá á ááŁá˘áá˝á á¨áá áááŽá˝á á¨áááá áĽá á¨ááá ἠáááłá áŁá¨áá´áá˝ ááááŤáá˝ á áááá˝ á áááááľ á ááŞáá˛áŤ áá ááááᢠáĽáá° á ááľ á°ááĽ, áá áá¨á á á á ááá áá´áá˝ áĽá ááľáá áŤá¸á áááłáá˝á ááá¨áłáľ á á áá. á¨ááłáĽ áá´áá˝á ááááľ ááá¨áłáľ á áĽáŤááłááą ááŁáĽá áá¨á¨áť áá ááá á áááąáľ á¨ááá áá°á ááľáĽ áá°ááá á¨á áá áľááŁá áŤáá¸á á áľááśá˝ á áááá˝á áĽáá¨á°áááá˘
áľááá ᣠscpy.optimize ááá á¨áá¨á°ááľá áá°áśá˝ áá°áá áá áŤá ááááá˘
- á¨á°ááŤáŠ áľáá° áááŽá˝á (Nelder-Mead simplexᣠBFGSᣠNewton's conjugate gradientsáŁ
áŽá˘á иSLSQP ) - ááá á áá áááťá¸áľ (áááłááĄ-
á°áá°áľ ááľá¨á ,ááŠááľ_áááá° ááἠ) - á¨áá¨áá ááááľ
á¤áá¤áᲠ(á˘áŤááľ_áŤáŹáá˝) áĽá ááĽá°á áŤááá á˘áŤááľ á¨áŤáŹáá˝ áŠáᣠá°áľáá áľáá° áááŽá˝ (á¨áá_ááľ) - á¨á ááľ á°áááá (minim_scalar) scalar á°ááŁáŤáľá ááááľ áĽá áľá áááá (root_scalar)
- á¨á°ááŤáŠ áľáá° áááŽá˝á (Hybrid Powell) á áá áá áááἠáĽáŠááł áľáááľ ááşáá˝ (áľá)
áá¨áá áá-áááłááľáľ ááá áĽáá° áľáá áá á áá´áá˝ááá°á-ááŞáá ).
á áá á˝áá ááľáĽ, á¨áá áááá ááľáĽ á¨ááááŞáŤáá ááĽá áĽáť áĽáááá¨áłáá.
á¨á ááŤáł á°ááááŽá˝ scalar á°ááŁáá áŤá á áľá áááł ááááľ
ᨠscipy.optimize áĽá á á¨áááá á ááľá°á á°ááŁá áááłá áĽá á áľá áááł á¨áá˝ á¨á ááŤáł á°ááááŽá˝ scalar á°ááŁáŤáľá áááááľ á¨á፠á áááá˝ áá°áŁáᢠá á áŤáŠá áááłá¨áľ á¨á ááŤáł á°ááááŽá˝ á°áľáá á°ááŁá áŤáľááááá, áá á á á°ááŤá¨ ááááľ áĽááááłáá.
ááĽááá ááááá˝áŁ ᨠN á°ááááŽá˝ ᨠRosenbrock á°ááŁá áášá ááᣠáĽáąá áááľáááĄ-
ᨠRosenbrock á°ááŁá áĽá Jacobi áĽá Hesse ááľáŞááľ (á¨ááááŞáŤá áĽá ááá°á á°áá˝áŚáá˝, á á á°á) á áľááľá 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 á°ááŁá áĽá´áśá˝á á 3 ᲠááľáĽ áĽááłáá˘
á¨ááľá áľ áŽáľ
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 á°ááŁá áá á°á áá áááá°á áĽáá´áľ ááłááá˝á áĽáááá¨áľ.
ááá áŤá áá´ á¨ááá°á-ááľ (ááá°á-ááľ)
áŁá 0-ááŹáľ áŚáł áá á¨ááááŞáŤ ááĽáĽ 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.]
á˛áááááľ áá´ á ááá á¨á°ááá áĽá á áľááá ááľááł á°ááŁáá áááááľ ááá ááááľ ááᢠá¨á°ááŁáŠ á°áá˝áŚáá˝á áľááľ á áŤáľááááá, áĽá´áśášá áĽáť áááá˝ á á áá. á¨ááá°á-ááľ áá´ áááá áá á°á á˝ááŽá˝ áĽáŠ áá፠áá. áááᣠááľ á ááľ áááśá˝á áľáááá ááᣠáá á°ááá áááááľ áĽá áá áááľáľ áá˝ááá˘
á¨ááá áá´
á¨á°ááŁá áĽá´áśá˝ áĽáť á¨áá°áá áľ ááá á¨áááťá¸áľ áľáá° ááá ááá˘
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) á áááŞáá
á¨áááľáá áá ááŁá áá
á°áľ áááááľ, á¨á á°áŤá áá°áą
ᨠRosenbrock á°ááŁáá á áľááłá ááá áĽáááááĄ-
áá á áááá˝ á¨ááááŞáŤá áĽá á¨áá¨á¨áťá áŤááá á áľá°áá áááá á°ááááŽá˝ á°áá˝áŚáá˝ á¨áá°áŤ áááĄ
áá á á áááľ á¨ááŤá°á ᨠ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
á¨ááŤá˛á¨ááľ áľááľ á°ááŁá á¨áłá˝ áĽáá°ááłá¨á áá á°áá á°ááŁá á¨áá áááŞáŤ áĽá´áľ áá á°áááżá.
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]
á¨á°ááá° ááŤá˛á¨ááľ (ááá°á) á áááŞáá
á áááŞáá
á¨ááá°á áá´ á¨á°áá°á¨á°á á á áŤáŁá˘á á áŤáŁá˘ áŤááá á°ááŁá á ááá°á á˛á᪠ááááá á ááááľ áá ááá˘
á¨áľ á¨ááá°á á°áá˝áŚáá˝ ááľáŞááľ áá (áá˛áŤá ááľáŞááľáŁ áá˛áŤá)á˘
áá˛áŤá á áááłá á¨ááᣠá¨áá
á°ááŁá á áŤáŁá˘áŤá áá
á°áá á¨áłáľáŤá˛á á
áá˝ áᎠá
áááľá á¨áᎠáá á áááłá°á ááá áá˝ááᢠáá¤áą ááá፠áááĄ-
á°ááá˘áŚáš áá˛áŤá á¨áá°áá á áŽááááľ ááŤá˛á¨ááľ áá´ ááᢠᨠRosenbrock á°ááŁáá áááááľ áá
áá áá´ á¨áá áá ááłá á¨áá
á áłá˝ ááá§áᢠá¨ááá°á-á˛á áá´á ááá áá áá˛áŤáá á¨ááŤá°á á°ááŁá áááá
á ááĽááľá˘
ᨠRosenbrock á°ááŁá áá˛áŤá á áľáá°á ááá áĽáŠá áááĄ-
á¨áľ и , ááľáŞááľ ááááš .
á¨á°ááŠáľ áᎠáŤááá á¨ááľáŞááľ á áŁáá˝ áĽáŠá áá¸ááĄ
áááłáᣠáŁá á ááľáľ á á áŁáŤá áŚáł N = 5ᣠá¨áá˛áŤá ááľáŞááľ á Rosenbrock á°ááŁá á¨áŁááľ á áá˝ á ááá˘
áá áá áá˛áŤáá á¨ááŤá°áá áŽáľ áĽá á¨áŽáááĽáŽáá á°ááŁá á¨ááááť áŽáľ (ááá°á) áá´á á áá áááĄ-
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]
á¨áá˛áŤá áááľ á°ááŁá áĽá á¨áááá° áŹáá°á áľááá áŤáá ááłá
á áĽááá°á á˝ááŽá˝ ááľáĽ á¨á á ááá á¨áá˛áŤá ááľáŞááľ áľááľ áĽá áá¨ááť á¨áá°á áá áĽá á¨ááľáłááľ ááĽáśá˝á áááá áá˝ááᢠá áá ááłá áá á¨áá˛áŤá ááľáŞááľ áĽáŤáąá áááá˝ á áŤáľáááá, ááááŤáąá á¨ááááą áá°áľ á¨áá˛áŤá áááľ áá áĽáŠá á¨áá áŹáá°á á¨áá á¨áááá° áŹáá°á áá áĽáť áááááᢠáľááá á¨áľááľ áĽááł á ááťá á¨áá˛áŤáá áááľ á áááá° áŹáá°á á¨ááááľ á°ááŁáá áá˛áŤáá áááá á¨á áá á°ááŤá ááá˘
á¨ááááľ áŹáá°áá áĽáá° ááááŞáŤá áá¨áŤá¨áŞáŤá áĽá á¨áááá° áŹáá°áá áĽáá° ááá°áá áá¨áŤá¨áŞáŤ á¨áááľá°áá á¨ááľ á°ááŁáá (á¨ááá˝ ááááŽá˝ áá áááááľ áá°ááŁáŠ á¨ááááĄáľ ááááŽá˝ áá) áááľ ááľáĽ áŤáľááĄá˘ á áĽá áááł, á¨áá˛áŤá áŚá áŽáááĽáŽá á°ááŁáá á áááá° áŹáá°á áááľááľ á áŁá á áľá¸á᪠á áá°áá. á¨áá p á¨áááá° áŹáá°á áá, á¨ááŤá áááą ááá°á:
á¨áá˛áŤáá áĽá á¨áááá° áŹáá°áá áááľ á¨ááŤá°áá á°ááŁá áĽáá° ááľá áá᪠áĽá´áľ áá° áá á°á á°ááŁá á°áááááĄ-
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
á¨áłáá ááá á áááŞáá áá°áŁáአááŹá˛á¨áŽá˝ (ááá°á)
á¨áá˛áŤá ááľáŞááľ á°áŤá áááł áĽá á¨á°áłáłáą á¨ááá á á
áŁáŤáá˝ á¨ááá°á á¨á°ááá° á
áááľ áľáá°-ááá áá¤áłá áĽááłááá ááŤá°áá áá˝ááᢠá áĽáá°áá
ááááľ áááłáá˝, áá፠á°á°áĽáˇá
á¨áá˛áŤá ááľáŞááľ áľááá áá ááłááĄ-
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.]
á¨áá˛áŤá áááľ á°ááŁá áĽá á¨áááá° áŹáá°á áá ááłááĄ-
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.]
ᨠKrylovsky á áááľ áá´áá˝
áĽáá° áĽáááľ-ncg áá´, ᨠKrylov á áááľ áá´áá˝ ááľáŞááľ-áŹáá°á áááśá˝á áĽáť áľááá áá áá á á°á á˝ááŽá˝á ááááłáľ á áŁá á°áľáá áá¸á. á¨áĽááą áááľ á á°ááŤá¨á á ᨠKrylov subspace á¨á°áá°á á áŤáľ áá°ááá ááá ááľáĽ áŤááá á˝áá áááłáľ áá. áĽááá á áááá á˝ááŽá˝áŁ áá
áá´ á¨áłááááľ-ncg áá´ áá á˛ááłá°á á ááľá°á ááľáá-áŤááá áľáááážá˝á áľááá áá á áĽáŤááłááą áááľ á˝áá ááľáŞááľ-áŹáá°á áááśá˝á áá áá á¨á°áťá ááᢠá á°á¨ááŞá, á¨áłáľáŤá˛á áááľ á˝áá áááľá á¨áĽáááľ-ncg áá´ á¨á áá á áľááá á°áááˇá.
á¨áá˛áŤá ááľáŞááľ áľááá áá ááłááĄ-
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.]
á¨áá˛áŤá áááľ á°ááŁá áĽá á¨áááá° áŹáá°á áá ááłááĄ-
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) áľááá á˝ááŽá˝á ááááłáľ (á áşáá˝ á¨ááá አá°ááááŽá˝) á áŁá á°áľáá áá¸á. áá á¨ááá áľ ááááŤáľ á¨áľá conjugate á áááľ áľáá° ááá á¨á°ááá˘áŚá˝ á¨áá˛áŤá ááľáŞááľ áááłá áááľá áľáááŤááááľ ááᢠá¨áá˛áŤá ááá˝ á¨áá ááľáááľ áłááá áááľáá á á°á°ááá á°áááˇá. ááááŤáąá ááá˛áŤá áááľ áĽá á¨áááá° áŹáá°á á°ááŁáá áááá˝ áĽáť áľáááŤáľáááá áá áľáá° ááá á á°áá á¨áľáááľ (á˛áŤááá áŁááľ) ááľáŞááľ áá áááľáŤáľ áĽáŠ ááᢠáá áá á°á á¨áá á°á¨ áľááľáł ááŞáá˝á áĽá ááá á¨áá á¨áá áá áŁáá˝á áŤáááŁá.
á ááŤá¨áá á°á¨á á˝ááŽá˝ ááľáĽ, áá˛áŤáá á¨áá¨áá¸áľ áĽá á¨ááá¨áľ áá ááłá á áá°áá. áá áááľ á áŤáľ á¨áá°ááá ááá ááľáĽ áŤá á˝ááŽá˝á á áľááá á áááłáľ á áĽááľ áľáááá˝ ááľáĽ áááľá ááááľ ááťáá ᢠáá áá áááľá¨áᣠá ááłááľ ááľáá-áŤááá áĽáŠááłáá˝ ááĽáŤááłááą áłáľáŤá˛á áááľ á˝áá á°á°ááá á áá ááአá°áá°ááᢠáĽáá˛á ááááą áááľá áĽááá áá ᨠCholesky Hessian ááľáŞááľ 3 ááá 4 ááľáááľá áá ááá. á áá¤áąá, áá´á á áĽááľ áľáááá˝áá˝ ááľáĽ áá°á á°áŁá áĽá á¨ááá˝ á¨á°á°áá አá¨áĽáááľ-áááá áá´áá˝ áŤáá° á°á¨áŁá á°ááŁá áľááľ áŤáľááááá. áá á áááŞáá á¨ááŤáááá°á áááá á¨áá˛áŤá ááľáŞááľ ááş áĽáť áá áĽá á¨áá˛áŤáá áááľ áĽá á¨áááá° áŹáá°áá á°ááŁá á¨áá áá á˝ááłá á áá°áááá˘
ᨠ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.])
á áá áá, ááááŁáľ, áĽááááá. á áááĽáá ááŁáĽá áľá áááłá á ááł áŁá¨áááľ á˝ááŽá˝á ááááłáľ á¨ááááľ á á°ááŁá á áŁá¨á ááľ á°áááá á°ááŁáá á ááááľ áŁá¨áááá° áľááážá˝á á ááááľ áĽá scipy.optimizeá á áá áá á¨áĽáŠááłáá˝ áľáááľá áááááľ á áŁá á áľá°áłá˝ á¨áááľá ááááá áĽáááŤááᢠáĽá á.
ááá:
ááá: hab.com