SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy (ืžื‘ื•ื˜ื sai pie) ื”ื™ื ื—ื‘ื™ืœืช ืืคืœื™ืงืฆื™ื•ืช ืžืชืžื˜ื™ืช ื”ืžื‘ื•ืกืกืช ืขืœ ื”ืจื—ื‘ื” Numpy Python. ืขื SciPy, ื”ืคืขืœืช Python ื”ืื™ื ื˜ืจืืงื˜ื™ื‘ื™ืช ืฉืœืš ื”ื•ืคื›ืช ืœืื•ืชื” ืกื‘ื™ื‘ืช ืžื“ืขื™ ื ืชื•ื ื™ื ืžืœืื” ื•ืกื‘ื™ื‘ืช ืื‘-ื˜ื™ืคื•ืก ืžื•ืจื›ื‘ืช ื›ืžื• MATLAB, IDL, Octave, R-Lab ื•-SciLab. ื”ื™ื•ื ืื ื™ ืจื•ืฆื” ืœื“ื‘ืจ ื‘ืงืฆืจื” ืขืœ ืื™ืš ืœื”ืฉืชืžืฉ ื‘ื›ืžื” ืืœื’ื•ืจื™ืชืžื™ ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื™ื“ื•ืขื™ื ื‘ื—ื‘ื™ืœืช scipy.optimize. ืขื–ืจื” ืžืคื•ืจื˜ืช ื•ืขื“ื›ื ื™ืช ื™ื•ืชืจ ืขืœ ืฉื™ืžื•ืฉ ื‘ืคื•ื ืงืฆื™ื•ืช ืชืžื™ื“ ืืคืฉืจ ืœืงื‘ืœ ื‘ืืžืฆืขื•ืช ื”ืคืงื•ื“ื” help() ืื• ื‘ืืžืฆืขื•ืช Shift+Tab.

ืžื‘ื•ื

ืขืœ ืžื ืช ืœื”ืฆื™ืœ ืืช ืขืฆืžืš ื•ืืช ื”ืงื•ืจืื™ื ืžื—ื™ืคื•ืฉ ื•ืงืจื™ืืช ืžืงื•ืจื•ืช ืจืืฉื•ื ื™ื™ื, ืงื™ืฉื•ืจื™ื ืœืชื™ืื•ืจื™ ืฉื™ื˜ื•ืช ื™ื”ื™ื• ื‘ืขื™ืงืจ ื‘ื•ื•ื™ืงื™ืคื“ื™ื”. ื›ื›ืœืœ, ืžื™ื“ืข ื–ื” ืžืกืคื™ืง ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ื”ืฉื™ื˜ื•ืช ื‘ืžื•ื ื—ื™ื ื›ืœืœื™ื™ื ื•ืืช ื”ืชื ืื™ื ืœื™ื™ืฉื•ืžื. ื›ื“ื™ ืœื”ื‘ื™ืŸ ืืช ืžื”ื•ืช ื”ืฉื™ื˜ื•ืช ื”ืžืชืžื˜ื™ื•ืช, ืขืงื•ื‘ ืื—ืจ ื”ืงื™ืฉื•ืจื™ื ืœืคืจืกื•ืžื™ื ืžื•ืกืžื›ื™ื ื™ื•ืชืจ, ืื•ืชื ื ื™ืชืŸ ืœืžืฆื•ื ื‘ืกื•ืฃ ื›ืœ ืžืืžืจ ืื• ื‘ืžื ื•ืข ื”ื—ื™ืคื•ืฉ ื”ืžื•ืขื“ืฃ ืขืœื™ืš.

ืื–, ืžื•ื“ื•ืœ scipy.optimize ื›ื•ืœืœ ื™ื™ืฉื•ื ืฉืœ ื”ื”ืœื™ื›ื™ื ื”ื‘ืื™ื:

  1. ืžื–ืขื•ืจ ืžื•ืชื ื” ื•ื‘ืœืชื™ ืžื•ืชื ื” ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืกืงืœืจื™ื•ืช ืฉืœ ืžืกืคืจ ืžืฉืชื ื™ื (ืžื™ื ื™ืžื•ื) ื‘ืืžืฆืขื•ืช ืืœื’ื•ืจื™ืชืžื™ื ืฉื•ื ื™ื (Nelder-Mead simplex, BFGS, ื ื™ื•ื˜ื•ืŸ ืžืฆื•ืžื“ ื’ืจื“ื™ืื ื˜ื™ื, ืงื•ื‘ื™ืœื” ะธ SLSQP)
  2. ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื’ืœื•ื‘ืœื™ืช (ืœื“ื•ื’ืžื”: ืื’ืŸ ืฉื•ืคื™ื ื’, diff_evolution)
  3. ืžื–ืขื•ืจ ืฉืืจื™ื•ืช MNC (ืœืคื—ื•ืช_ืจื™ื‘ื•ืขื™ื) ื•ืืœื’ื•ืจื™ืชืžื™ื ืฉืœ ื”ืชืืžืช ืขืงื•ืžื” ื‘ืืžืฆืขื•ืช ืจื™ื‘ื•ืขื™ื ืงื˜ื ื™ื ืœื ืœื™ื ื™ืืจื™ื™ื (Curve_fit)
  4. ืžื–ืขื•ืจ ืคื•ื ืงืฆื™ื•ืช ืกืงืœืจื™ื•ืช ืฉืœ ืžืฉืชื ื” ืื—ื“ (minim_scalar) ื•ื—ื™ืคื•ืฉ ืฉื•ืจืฉื™ื (root_scalar)
  5. ืคื•ืชืจื™ื ืจื‘ ืžื™ืžื“ื™ื™ื ืฉืœ ืžืขืจื›ืช ืžืฉื•ื•ืื•ืช (ืฉื•ืจืฉ) ื‘ืืžืฆืขื•ืช ืืœื’ื•ืจื™ืชืžื™ื ืฉื•ื ื™ื (ืคืื•ื•ืœ ื”ื™ื‘ืจื™ื“ื™, ืœื‘ื ื‘ืจื’-ืžืจืงื•ืจื“ื˜ ืื• ืฉื™ื˜ื•ืช ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ ื›ื’ื•ืŸ ื ื™ื•ื˜ื•ืŸ ืงืจื™ืœื•ื‘).

ื‘ืžืืžืจ ื–ื” ื ืฉืงื•ืœ ืจืง ืืช ื”ืคืจื™ื˜ ื”ืจืืฉื•ืŸ ืžื›ืœ ืจืฉื™ืžื” ื–ื•.

ืžื–ืขื•ืจ ื‘ืœืชื™ ืžื•ืชื ื” ืฉืœ ืคื•ื ืงืฆื™ื” ืกืงืœืจื™ืช ืฉืœ ืžืกืคืจ ืžืฉืชื ื™ื

ืคื•ื ืงืฆื™ื™ืช ื”ืžื™ื ื™ืžื•ื ืžื—ื‘ื™ืœืช scipy.optimize ืžืกืคืงืช ืžืžืฉืง ื›ืœืœื™ ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ืžื–ืขื•ืจ ืžื•ืชื ื•ืช ื•ื‘ืœืชื™ ืžื•ืชื ื•ืช ืฉืœ ืคื•ื ืงืฆื™ื•ืช ืกืงืœืจื™ื•ืช ืฉืœ ืžืกืคืจ ืžืฉืชื ื™ื. ื›ื“ื™ ืœื”ื“ื’ื™ื ืื™ืš ื–ื” ืขื•ื‘ื“, ื ืฆื˜ืจืš ืคื•ื ืงืฆื™ื” ืžืชืื™ืžื” ืฉืœ ื›ืžื” ืžืฉืชื ื™ื, ืื•ืชื ื ืžื–ืขืจ ื‘ื“ืจื›ื™ื ืฉื•ื ื•ืช.

ืœืžื˜ืจื•ืช ืืœื”, ืคื•ื ืงืฆื™ื™ืช Rosenbrock ืฉืœ N ืžืฉืชื ื™ื ืžื•ืฉืœืžืช, ืฉื™ืฉ ืœื” ืืช ื”ืฆื•ืจื”:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืœืžืจื•ืช ื”ืขื•ื‘ื“ื” ืฉืคื•ื ืงืฆื™ื™ืช Rosenbrock ื•ื”ืžื˜ืจื™ืฆื•ืช Jacobi ื•ื”-Hssian ืฉืœื” (ื”ื ื’ื–ืจืช ื”ืจืืฉื•ื ื” ื•ื”ืฉื ื™ื™ื”, ื‘ื”ืชืืžื”) ื›ื‘ืจ ืžื•ื’ื“ืจื•ืช ื‘ื—ื‘ื™ืœืช 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)

ืœืžืขืŸ ื”ื‘ื”ื™ืจื•ืช, ื‘ื•ืื• ื ืฆื™ื™ืจ ื‘ืชืœืช ืžื™ืžื“ ืืช ื”ืขืจื›ื™ื ืฉืœ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง ืฉืœ ืฉื ื™ ืžืฉืชื ื™ื.

ืงื•ื“ ืฆื™ื•ืจ

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()

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืœื“ืขืช ืžืจืืฉ ืฉื”ืžื™ื ื™ืžื•ื ื”ื•ื 0 ื‘ SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”, ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื“ื•ื’ืžืื•ืช ื›ื™ืฆื“ ืœืงื‘ื•ืข ืืช ื”ืขืจืš ื”ืžื™ื ื™ืžืœื™ ืฉืœ ืคื•ื ืงืฆื™ื™ืช Rosenbrock ื‘ืืžืฆืขื•ืช ื ื”ืœื™ื ืฉื•ื ื™ื ืฉืœ scipy.optimize.

ืฉื™ื˜ืช Nelder-Mead Simplex

ืชื”ื™ื” ื ืงื•ื“ื” ื”ืชื—ืœืชื™ืช x0 ื‘ืžืจื—ื‘ 5 ืžื™ืžื“ื™. ื‘ื•ืื• ื ืžืฆื ืืช ื ืงื•ื“ืช ื”ืžื™ื ื™ืžื•ื ืฉืœ ืคื•ื ืงืฆื™ื™ืช Rosenbrock ื”ืงืจื•ื‘ื” ืืœื™ื” ื‘ืืžืฆืขื•ืช ื”ืืœื’ื•ืจื™ืชื Nelder-Mead simplex (ื”ืืœื’ื•ืจื™ืชื ืžืฆื•ื™ืŸ ื›ืขืจืš ืฉืœ ืคืจืžื˜ืจ ื”ืฉื™ื˜ื”):

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 ื”ื™ื ื‘ื—ื™ืจื” ื˜ื•ื‘ื” ืœื‘ืขื™ื•ืช ืžื–ืขื•ืจ ืคืฉื•ื˜ื•ืช. ืขื ื–ืืช, ืžื›ื™ื•ื•ืŸ ืฉื”ื•ื ืื™ื ื• ืžืฉืชืžืฉ ื‘ื”ืขืจื›ื•ืช ืฉื™ืคื•ืข, ื™ื™ืชื›ืŸ ืฉื™ื™ืงื— ื–ืžืŸ ืจื‘ ื™ื•ืชืจ ืœืžืฆื•ื ืืช ื”ืžื™ื ื™ืžื•ื.

ืฉื™ื˜ืช ืคืื•ื•ืœ

ืืœื’ื•ืจื™ืชื ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื ื•ืกืฃ ืฉื‘ื• ืจืง ืขืจื›ื™ ื”ืคื•ื ืงืฆื™ื•ืช ืžื—ื•ืฉื‘ื™ื ื”ื•ื ืฉื™ื˜ืช ืคืื•ื•ืœ. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ื•, ืขืœื™ืš ืœื”ื’ื“ื™ืจ ืฉื™ื˜ื” = 'ืคืื•ื•ืœ' ื‘ืคื•ื ืงืฆื™ื™ืช ื”ืžื™ื ื™ืžื•ื.

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).

ื›ื“ื™ ืœื”ืฉื™ื’ ื”ืชื›ื ืกื•ืช ืžื”ื™ืจื” ื™ื•ืชืจ ืœืคืชืจื•ืŸ, ื”ื”ืœื™ืš BFGS ืžืฉืชืžืฉ ื‘ืฉื™ืคื•ืข ืฉืœ ืคื•ื ืงืฆื™ื™ืช ื”ืžื˜ืจื”. ื ื™ืชืŸ ืœืฆื™ื™ืŸ ืืช ื”ื’ืจื“ื™ืื ื˜ ื›ืคื•ื ืงืฆื™ื” ืื• ืœื—ืฉื‘ ื‘ืืžืฆืขื•ืช ื”ืคืจืฉื™ ืžืกื“ืจ ืจืืฉื•ืŸ. ื‘ื›ืœ ืžืงืจื”, ืฉื™ื˜ืช BFGS ื“ื•ืจืฉืช ื‘ื“ืจืš ื›ืœืœ ืคื—ื•ืช ืงืจื™ืื•ืช ืœืคื•ื ืงืฆื™ื” ืžืืฉืจ ืฉื™ื˜ืช ื”ืกื™ืžืคืœืงืก.

ื”ื‘ื” ื ืžืฆื ืืช ื”ื ื’ื–ืจืช ืฉืœ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง ื‘ืฆื•ืจื” ืื ืœื™ื˜ื™ืช:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ื‘ื™ื˜ื•ื™ ื–ื” ืชืงืฃ ืขื‘ื•ืจ ื”ื ื’ื–ืจื•ืช ืฉืœ ื›ืœ ื”ืžืฉืชื ื™ื ืœืžืขื˜ ื”ืจืืฉื•ืŸ ื•ื”ืื—ืจื•ืŸ, ื”ืžื•ื’ื“ืจื™ื ื›:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืคื•ื ืงืฆื™ื™ืช 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 ืฉืœ ืคื•ื ืงืฆื™ื™ืช ื”ืžื™ื ื™ืžื•ื, ื›ืคื™ ืฉืžื•ืฆื’ ืœื”ืœืŸ.

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]

ืืœื’ื•ืจื™ืชื ื’ืจื“ื™ืื ื˜ ืžืฆื•ืžื“ (ื ื™ื•ื˜ื•ืŸ)

ืืœื’ื•ืจื™ืชื ืฉื™ืคื•ืขื™ื ืžืฆื•ืžื“ื™ื ืฉืœ ื ื™ื•ื˜ื•ืŸ ื”ื™ื ืฉื™ื˜ืช ื ื™ื•ื˜ื•ืŸ ืฉื•ื ื”.
ื”ืฉื™ื˜ื” ืฉืœ โ€‹โ€‹ื ื™ื•ื˜ื•ืŸ ืžื‘ื•ืกืกืช ืขืœ ืงื™ืจื•ื‘ ืคื•ื ืงืฆื™ื” ื‘ืื–ื•ืจ ืžืงื•ืžื™ ืขืœ ื™ื“ื™ ืคื•ืœื™ื ื•ื ืžื”ืžืขืœื” ื”ืฉื ื™ื™ื”:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืื™ืคื” SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื”ื™ื ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ืฉืœ ื ื’ื–ืจื•ืช ืฉื ื™ื•ืช (ื”ืกื™ืื ื™ืช, ื”ืกื™ืื ื™ืช).
ืื ื”ื”ืกื™ืืŸ ืžื•ื’ื“ืจ ื—ื™ื•ื‘ื™, ืื–ื™ ื ื™ืชืŸ ืœืžืฆื•ื ืืช ื”ืžื™ื ื™ืžื•ื ื”ืžืงื•ืžื™ ืฉืœ ืคื•ื ืงืฆื™ื” ื–ื• ืขืœ ื™ื“ื™ ื”ืฉื•ื•ืืช ืฉื™ืคื•ืข ื”ืืคืก ืฉืœ ื”ืฆื•ืจื” ื”ืจื™ื‘ื•ืขื™ืช ืœืืคืก. ื”ืชื•ืฆืื” ืชื”ื™ื” ื”ื‘ื™ื˜ื•ื™:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ื”ื”ืกื™ืืŸ ื”ื”ื™ืคื•ืš ืžื—ื•ืฉื‘ ื‘ืฉื™ื˜ืช ืฉื™ืคื•ืข ืžืฆื•ืžื“. ื“ื•ื’ืžื” ืœืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ื” ื–ื• ื›ื“ื™ ืœืžื–ืขืจ ืืช ืคื•ื ืงืฆื™ื™ืช Rosenbrock ื ื™ืชื ืช ืœื”ืœืŸ. ื›ื“ื™ ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ืช ื ื™ื•ื˜ื•ืŸ-CG, ืขืœื™ืš ืœืฆื™ื™ืŸ ืคื•ื ืงืฆื™ื” ืฉืžื—ืฉื‘ืช ืืช ื”ื”ืกื™ืืŸ.
ื”ืคื•ื ืงืฆื™ื” ื”ื”ืกื™ื ื™ืช ืฉืœ ืจื•ื–ื ื‘ืจื•ืง ื‘ืฆื•ืจื” ืื ืœื™ื˜ื™ืช ืฉื•ื•ื” ืœ:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืื™ืคื” SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ะธ SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”, ื”ื’ื“ืจ ืืช ื”ืžื˜ืจื™ืฆื” SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”.

ื”ืจื›ื™ื‘ื™ื ื”ื ื•ืชืจื™ื ืฉืื™ื ื ืืคืก ืฉืœ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ืฉื•ื•ื™ื ืœ:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืœื“ื•ื’ืžื”, ื‘ืžืจื—ื‘ ื—ืžื™ืฉื” ืžืžื“ื™ N = 5, ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช ืขื‘ื•ืจ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง ื”ื™ื ื‘ืฆื•ืจืช ืคืก:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ืงื•ื“ ืฉืžื—ืฉื‘ ืืช ื”ื”ืกื™ืืŸ ื”ื–ื” ื™ื—ื“ ืขื ืงื•ื“ ืœืžื–ืขื•ืจ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง ื‘ืฉื™ื˜ืช ืฉื™ืคื•ืข ืžืฆื•ืžื“ (ื ื™ื•ื˜ื•ืŸ):

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]

ื“ื•ื’ืžื” ืขื ื”ื’ื“ืจืช ืคื•ื ืงืฆื™ื™ืช ื”ืžื›ืคืœื” ืฉืœ ื”ื”ืกื™ืืŸ ื•ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™

ื‘ื‘ืขื™ื•ืช ื‘ืขื•ืœื ื”ืืžื™ืชื™, ืžื—ืฉื•ื‘ ื•ืื—ืกื•ืŸ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช ื›ื•ืœื” ื™ื›ื•ืœื™ื ืœื“ืจื•ืฉ ื–ืžืŸ ื•ืžืฉืื‘ื™ ื–ื™ื›ืจื•ืŸ ืžืฉืžืขื•ืชื™ื™ื. ื‘ืžืงืจื” ื–ื”, ืœืžืขืฉื” ืื™ืŸ ืฆื•ืจืš ืœืฆื™ื™ืŸ ืืช ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช ืขืฆืžื”, ื›ื™ ื”ืœื™ืš ื”ืžื–ืขื•ืจ ื“ื•ืจืฉ ืจืง ื•ืงื˜ื•ืจ ื”ืฉื•ื•ื” ืœืžื›ืคืœืช ื”ื”ืกื™ืืŸ ืขื ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™ ืื—ืจ. ืœืคื™ื›ืš, ืžื ืงื•ื“ืช ืžื‘ื˜ ื—ื™ืฉื•ื‘ื™ืช, ืขื“ื™ืฃ ืœื”ื’ื“ื™ืจ ืžื™ื“ ืคื•ื ืงืฆื™ื” ืฉืžื—ื–ื™ืจื” ืืช ื”ืชื•ืฆืื” ืฉืœ ืžื›ืคืœืช ื”ื”ืกื™ืืŸ ืขื ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™.

ืงื—ื• ื‘ื—ืฉื‘ื•ืŸ ืืช ืคื•ื ืงืฆื™ื™ืช hess, ืฉืœื•ืงื—ืช ืืช ื•ืงื˜ื•ืจ ื”ืžื–ืขื•ืจ ื›ืืจื’ื•ืžื ื˜ ื”ืจืืฉื•ืŸ, ื•ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™ ื›ืืจื’ื•ืžื ื˜ ื”ืฉื ื™ (ื™ื—ื“ ืขื ืืจื’ื•ืžื ื˜ื™ื ืื—ืจื™ื ืฉืœ ื”ืคื•ื ืงืฆื™ื” ืฉื™ืฉ ืœืžื–ืขืจ). ื‘ืžืงืจื” ืฉืœื ื•, ื—ื™ืฉื•ื‘ ืžื›ืคืœืช ื”ื”ืกื™ืืŸ ืฉืœ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง ืขื ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™ ืื™ื ื• ืงืฉื” ื‘ืžื™ื•ื—ื“. ืื p ื”ื•ื ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™, ื•ืื– ื”ืžื•ืฆืจ SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ื™ืฉ ืืช ื”ืฆื•ืจื”:

SciPy, ืื•ืคื˜ื™ืžื™ื–ืฆื™ื”

ื”ืคื•ื ืงืฆื™ื” ืฉืžื—ืฉื‘ืช ืืช ื”ืžื›ืคืœื” ืฉืœ ื”-Hssian ื•ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™ ืžื•ืขื‘ืจืช ื›ืขืจืš ืฉืœ ื”ืืจื’ื•ืžื ื˜ 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

ืืœื’ื•ืจื™ืชื ืื–ื•ืจ ืืžื•ืŸ ื’ืจื“ื™ืื ื˜ ืžืฆื•ืžื“ (ื ื™ื•ื˜ื•ืŸ)

ื”ืชื ื™ื” ืœืงื•ื™ื” ืฉืœ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช ื•ื›ื™ื•ื•ื ื™ ื—ื™ืคื•ืฉ ืฉื’ื•ื™ื™ื ืขืœื•ืœื™ื ืœื’ืจื•ื ืœืืœื’ื•ืจื™ืชื ื”ื’ืจื“ื™ืื ื˜ ื”ืžืฆื•ืžื“ ืฉืœ ื ื™ื•ื˜ื•ืŸ ืœื”ื™ื•ืช ืœื ื™ืขื™ืœ. ื‘ืžืงืจื™ื ื›ืืœื” ื ื™ืชื ืช ืขื“ื™ืคื•ืช ืœ ืฉื™ื˜ืช ืืžื•ืŸ ื‘ืื–ื•ืจ (ืื–ื•ืจ ืืžื•ืŸ) ืžืฆืžื™ื“ื™ื ื’ืจื“ื™ืื ื˜ื™ื ืฉืœ ื ื™ื•ื˜ื•ืŸ.

ื“ื•ื’ืžื” ืœื”ื’ื“ืจื” ืฉืœ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืช:

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.]

ืฉื™ื˜ื•ืช ืžืกื•ื’ ืงืจื™ืœื•ื‘

ื‘ื“ื•ืžื” ืœืฉื™ื˜ืช ื”-trust-ncg, ืฉื™ื˜ื•ืช ืžืกื•ื’ Krylov ืžืชืื™ืžื•ืช ื”ื™ื˜ื‘ ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ ืžื›ื™ื•ื•ืŸ ืฉื”ืŸ ืžืฉืชืžืฉื•ืช ืจืง ื‘ืžื•ืฆืจื™ ื•ืงื˜ื•ืจ ืžื˜ืจื™ืงืก. ื”ืžื”ื•ืช ืฉืœื”ื ื”ื™ื ืœืคืชื•ืจ ื‘ืขื™ื” ื‘ืื–ื•ืจ ื‘ื™ื˜ื—ื•ืŸ ืžื•ื’ื‘ืœ ืขืœ ื™ื“ื™ ืชืช ืžืจื—ื‘ ืงืจื™ืœื•ื‘ ืงื˜ื•ื. ืœื‘ืขื™ื•ืช ืœื ื•ื“ืื•ืช, ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘ืฉื™ื˜ื” ื–ื•, ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื ืžืฉืชืžืฉืช ื‘ืžืกืคืจ ืงื˜ืŸ ื™ื•ืชืจ ืฉืœ ืื™ื˜ืจืฆื™ื•ืช ืœื ืœื™ื ื™ืืจื™ื•ืช ื‘ื’ืœืœ ื”ืžืกืคืจ ื”ืงื˜ืŸ ื™ื•ืชืจ ืฉืœ ืžื•ืฆืจื™ ืžื˜ืจื™ืงืก-ื•ืงื˜ื•ืจ ืœื›ืœ ืชืช-ื‘ืขื™ื”, ื‘ื”ืฉื•ื•ืื” ืœืฉื™ื˜ืช trust-ncg. ื‘ื ื•ืกืฃ, ื”ืคืชืจื•ืŸ ืœื‘ืขื™ื™ืช ื”ืžืฉื ื” ื”ืจื™ื‘ื•ืขื™ืช ื ืžืฆื ื‘ืฆื•ืจื” ืžื“ื•ื™ืงืช ื™ื•ืชืจ ืžืืฉืจ ืฉื™ืžื•ืฉ ื‘ืฉื™ื˜ืช trust-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) ืžืชืื™ืžื•ืช ื”ื™ื˜ื‘ ืœืคืชืจื•ืŸ ื‘ืขื™ื•ืช ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ (ืขื ืืœืคื™ ืžืฉืชื ื™ื). ื–ื” ื ื•ื‘ืข ืžื”ืขื•ื‘ื“ื” ืฉืืœื’ื•ืจื™ืชื ื”ื’ืจื“ื™ืื ื˜ ื”ืžืฆื•ืžื“ ื”ื‘ืกื™ืกื™ ืžืจืžื– ืขืœ ืงื‘ื™ืขื” ืžืฉื•ืขืจืช ืฉืœ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืช ื”ื”ืคื•ื›ื”. ื”ืคืชืจื•ืŸ ื ืžืฆื ื‘ืื•ืคืŸ ืื™ื˜ืจื˜ื™ื‘ื™, ืœืœื ื”ืจื—ื‘ื” ืžืคื•ืจืฉืช ืฉืœ ื”ื”ืกื™ืืŸ. ืžื›ื™ื•ื•ืŸ ืฉืฆืจื™ืš ืœื”ื’ื“ื™ืจ ืจืง ืคื•ื ืงืฆื™ื” ืœืžื›ืคืœื” ืฉืœ ื”ืกืกื™ืืŸ ื•ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™, ืืœื’ื•ืจื™ืชื ื–ื” ื˜ื•ื‘ ื‘ืžื™ื•ื—ื“ ืœืขื‘ื•ื“ื” ืขื ืžื˜ืจื™ืฆื•ืช ื“ืœื™ืœื•ืช (ืืœื›ืกื•ื ื™ ืคืก). ื–ื” ืžืกืคืง ืขืœื•ื™ื•ืช ื–ื™ื›ืจื•ืŸ ื ืžื•ื›ื•ืช ื•ื—ื™ืกื›ื•ืŸ ืžืฉืžืขื•ืชื™ ื‘ื–ืžืŸ.

ืœื‘ืขื™ื•ืช ื‘ื’ื•ื“ืœ ื‘ื™ื ื•ื ื™, ืขืœื•ืช ื”ืื—ืกื•ืŸ ื•ื”ืคืจืงืฆื™ื” ืฉืœ ื”ื”ืกื™ืืŸ ืื™ื ื” ืงืจื™ื˜ื™ืช. ื”ืžืฉืžืขื•ืช ื”ื™ื ืฉื ื™ืชืŸ ืœื”ืฉื™ื’ ืคืชืจื•ืŸ ื‘ืคื—ื•ืช ืื™ื˜ืจืฆื™ื•ืช, ื•ืœืคืชื•ืจ ืืช ื‘ืขื™ื•ืช ื”ืžืฉื ื” ืฉืœ ืื–ื•ืจ ื”ืืžื•ืŸ ื›ืžืขื˜ ื‘ืžื“ื•ื™ืง. ืœืฉื ื›ืš, ื›ืžื” ืžืฉื•ื•ืื•ืช ืœื ืœื™ื ื™ืืจื™ื•ืช ื ืคืชืจื•ืช ื‘ืื•ืคืŸ ืื™ื˜ืจื˜ื™ื‘ื™ ืขื‘ื•ืจ ื›ืœ ืชืช-ื‘ืขื™ื” ืจื™ื‘ื•ืขื™ืช. ืคืชืจื•ืŸ ื›ื–ื” ื“ื•ืจืฉ ื‘ื“ืจืš ื›ืœืœ 3 ืื• 4 ืคื™ืจื•ืงื™ื Cholesky ืฉืœ ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช. ื›ืชื•ืฆืื” ืžื›ืš, ื”ืฉื™ื˜ื” ืžืชื›ื ืกืช ื‘ืคื—ื•ืช ืื™ื˜ืจืฆื™ื•ืช ื•ื“ื•ืจืฉืช ืคื—ื•ืช ื—ื™ืฉื•ื‘ื™ ืคื•ื ืงืฆื™ื•ืช ืื•ื‘ื™ื™ืงื˜ื™ื‘ื™ื•ืช ืžืืฉืจ ืฉื™ื˜ื•ืช ืื–ื•ืจื™ ื‘ื™ื˜ื—ื•ืŸ ืžื™ื•ืฉืžื•ืช ืื—ืจื•ืช. ืืœื’ื•ืจื™ืชื ื–ื” ืžืจืžื– ืจืง ืขืœ ืงื‘ื™ืขืช ื”ืžื˜ืจื™ืฆื” โ€‹โ€‹ื”ื”ืกื™ืื ื™ืช ื”ืฉืœืžื” ื•ืื™ื ื• ืชื•ืžืš ื‘ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื™ืช ื”ืžื›ืคืœื” ืฉืœ ื”ื”ืกื™ืืŸ ื•ื‘ื•ืงื˜ื•ืจ ืฉืจื™ืจื•ืชื™.

ื“ื•ื’ืžื” ืขื ืžื–ืขื•ืจ ืฉืœ ืคื•ื ืงืฆื™ื™ืช ืจื•ื–ื ื‘ืจื•ืง:

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 ื—ึฒื‘ึดื™ืœึธื”.

ืžืงื•ืจ: https://docs.scipy.org/doc/scipy/reference/

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”