SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy (pronounced sai pie) เปเบกเปˆเบ™เบŠเบธเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบฒเบ‡เบ„เบฐเบ™เบดเบ”เบชเบฒเบ”เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ Numpy Python. เบ”เป‰เบงเบ SciPy, เป€เบŠเบ”เบŠเบฑเบ™ Python เปเบšเบšเป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเบเบฒเบเป€เบ›เบฑเบ™เบงเบดเบ—เบฐเบเบฒเบชเบฒเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบšเบ”เบฝเบงเบเบฑเบ™ เปเบฅเบฐเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบšเบšเบฅเบฐเบšเบปเบšเบ—เบตเปˆเบŠเบฑเบšเบŠเป‰เบญเบ™เป€เบŠเบฑเปˆเบ™ MATLAB, IDL, Octave, R-Lab, เปเบฅเบฐ SciLab. เบกเบทเป‰เบ™เบตเป‰เบ‚เป‰เบญเบเบขเบฒเบเป€เบงเบปเป‰เบฒเบชเบฑเป‰เบ™เป†เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเปƒเบ™เบŠเบธเบ” scipy.optimize. เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบเบงเปˆเบฒ เปเบฅเบฐเบ—เบฑเบ™เบชเบฐเปƒเปเบเบงเปˆเบฒเปƒเบ™เบเบฒเบ™เบ™เบณเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เปˆเบฒเบ‡เป†เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเป„เบ”เป‰เบชเบฐเป€เปเบตเป‚เบ”เบเปƒเบŠเป‰เบ„เบณเบชเบฑเปˆเบ‡ help() เบซเบผเบทเปƒเบŠเป‰ Shift+Tab.

เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เป€เบžเบทเปˆเบญเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เปเบฅเบฐเบœเบนเป‰เบญเปˆเบฒเบ™เบˆเบฒเบเบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปเบฅเบฐเบเบฒเบ™เบญเปˆเบฒเบ™เปเบซเบผเปˆเบ‡เบ•เบปเป‰เบ™เบ•เป, เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบงเบดเบ—เบตเบเบฒเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ Wikipedia. เบ•เบฒเบกเบเบปเบ”เบฅเบฐเบšเบฝเบš, เบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เปƒเบ™เบ‚เปเป‰เบเปเบฒเบ™เบปเบ”เบ—เบปเปˆเบงเป„เบ›เปเบฅเบฐเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ—เบฒเบ‡เบ„เบฐเบ™เบดเบ”เบชเบฒเบ”, เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบชเบดเปˆเบ‡เบžเบดเบกเบ—เบตเปˆเบกเบตเบญเปเบฒเบ™เบฒเบ”เบซเบผเบฒเบ, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบšเบปเบ”เบ„เบงเบฒเบกเบซเบผเบทเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบเบŠเบญเบเบซเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฑเบ.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป‚เบกเบ”เบนเบ™ scipy.optimize เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  1. เบเบฒเบ™เบซเบผเบธเบ”เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปเบšเบšเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚ เปเบฅเบฐเบšเปเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ scalar เบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบซเบผเบฒเบเบ•เบปเบงเปเบ› (เปœเป‰เบญเบเบชเบธเบ”) เป‚เบ”เบเปƒเบŠเป‰เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ•เปˆเบฒเบ‡เป† (Nelder-Mead simplex, BFGS, Newton conjugate gradients, เป‚เบ„เบšเบตเบฅเบฒ ะธ SLSQP)
  2. เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบปเปˆเบงเป‚เบฅเบ (เบ•เบปเบงเบขเปˆเบฒเบ‡: basinhopping, diff_evolution)
  3. เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ•เบปเบเบ„เป‰เบฒเบ‡ MNC (least_squares) เปเบฅเบฐโ€‹เบชเบนเบ”โ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšโ€‹เป€เบชเบฑเป‰เบ™โ€‹เป‚เบ„เป‰เบ‡โ€‹เป‚เบ”เบโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบชเบตเปˆโ€‹เบซเบผเปˆเบฝเบกโ€‹เบกเบปเบ™โ€‹เบ™เป‰เบญเบโ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เปเบกเปˆเบ™โ€‹เป€เบชเบฑเป‰เบ™ (curve_fitโ€‹)
  4. เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡ scalar เบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบซเบ™เบถเปˆเบ‡ (minim_scalar) เปเบฅเบฐเบเบฒเบ™เบŠเบญเบเบซเบฒเบฎเบฒเบ (root_scalar)
  5. เบ•เบปเบงเปเบเป‰เป„เบ‚เบซเบผเบฒเบเบกเบดเบ•เบดเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบชเบปเบกเบœเบปเบ™ (เบฎเบฒเบ) เป‚เบ”เบเปƒเบŠเป‰เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ•เปˆเบฒเบ‡เป† (เบ›เบฐเบชเบปเบก Powell, Levenberg-Marquardt เบซเบผเบทเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบŠเบฑเปˆเบ™: Newton-Krylov).

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบžเบฝเบ‡เปเบ•เปˆเบฅเบฒเบเบเบฒเบ™เบ—เปเบฒเบญเบดเบ”เบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰.

เบเบฒเบ™เบซเบผเบธเบ”เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปเบšเบšเบšเปเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ scalar เบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบซเบผเบฒเบเบญเบฑเบ™

เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เป‰เบญเบเบชเบธเบ”เบˆเบฒเบเบŠเบธเบ” scipy.optimize เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เปเบฅเบฐเบšเปเปˆเบกเบตเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ scalar เบ‚เบญเบ‡เบซเบผเบฒเบเบ•เบปเบงเปเบ›. เป€เบžเบทเปˆเบญเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ•เป‰เบญเบ‡เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบซเบผเบฒเบ, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบซเบผเบธเบ”เบฅเบปเบ‡เปƒเบ™เบงเบดเบ—เบตเบ•เปˆเบฒเบ‡เป†.

เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เบซเบ™เป‰เบฒเบ—เบตเปˆ Rosenbrock เบ‚เบญเบ‡ N variables เปเบกเปˆเบ™เบชเบปเบกเบšเบนเบ™เปเบšเบš, เป€เบŠเบดเปˆเบ‡เบกเบตเบฎเบนเบšเปเบšเบš:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบŸเบฑเบ‡เบŠเบฑเบ™ Rosenbrock เปเบฅเบฐ Jacobi เปเบฅเบฐ Hessian matrices เบ‚เบญเบ‡เบกเบฑเบ™ (เบญเบฐเบ™เบธเบžเบฑเบ™เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบ—เบตเบชเบญเบ‡, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš) เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™เบŠเบธเบ” 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)

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเปเบ•เป‰เบกเปƒเบ™ 3D เบ„เปˆเบฒเบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ Rosenbrock เบ‚เบญเบ‡เบชเบญเบ‡เบ•เบปเบงเปเบ›.

เบฅเบฐเบซเบฑเบ”เปเบ•เป‰เบก

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 เบ—เบตเปˆเปƒเบเป‰เบ—เบตเปˆเบชเบธเบ”เบเบฑเบšเบกเบฑเบ™เป‚เบ”เบเปƒเบŠเป‰ algorithm 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.]

เบงเบดเบ—เบตเบเบฒเบ™ simplex เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบ‡เปˆเบฒเบเบ—เบตเปˆเบชเบธเบ”เบ—เบตเปˆเบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ—เบตเปˆเบ–เบทเบเบเปเบฒเบ™เบปเบ”เบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เปเบฅเบฐเบฅเบฝเบšเบ‡เปˆเบฒเบ. เบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบญเบฐเบ™เบธเบžเบฑเบ™เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™; เบกเบฑเบ™เบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบฅเบฐเบšเบธเบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบงเบดเบ—เบตเบเบฒเบ™ Nelder-Mead เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบซเบฒเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบกเบฑเบ™เบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเป€เบกเบตเบ™เบฅเบฐเบ”เบฑเบšเบชเบต, เบกเบฑเบ™เบญเบฒเบ”เปƒเบŠเป‰เป€เบงเบฅเบฒเบ”เบปเบ™เบเบงเปˆเบฒเป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆ.

เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™ Powell

เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเบ„เปˆเบฒเบŸเบฑเบ‡เบŠเบฑเบ™เบ–เบทเบเบ„เบณเบ™เบงเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡ Powell. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ” method = 'powell' เปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆ.

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

เป€เบžเบทเปˆเบญโ€‹เปƒเบซเป‰โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบš convergence เป„เบงโ€‹เบ‚เบถเป‰เบ™โ€‹เบเบฑเบšโ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹, เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบเบฒเบ™โ€‹ BFGS เปƒเบŠเป‰ gradient เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡. gradient เบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบซเบผเบทเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเปƒเบŠเป‰เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เปเบฒเบญเบดเบ”. เปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบงเบดเบ—เบตเบเบฒเบ™ BFGS เป‚เบ”เบเบ›เบปเบเบเบฐเบ•เบดเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป‚เบ—เบซเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบซเบ™เป‰เบญเบเบเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™ simplex.

เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบ•เบปเบงเบžเบฑเบ™เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ Rosenbrock เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบเบ™เบตเป‰เปเบกเปˆเบ™เบ–เบทเบเบ•เป‰เบญเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเปเบ›เบ‚เบญเบ‡เบ•เบปเบงเปเบ›เบ—เบฑเบ‡เบซเบกเบปเบ”เบเบปเบเป€เบงเบฑเป‰เบ™เบ•เบปเบงเบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป€เบ›เบฑเบ™:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ Python เบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆ gradient เบ™เบตเป‰:

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

เบŸเบฑเบ‡เบŠเบฑเบ™เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ gradient เปเบกเปˆเบ™เบฅเบฐเบšเบธเป€เบ›เบฑเบ™เบ„เปˆเบฒเบ‚เบญเบ‡ 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]

Conjugate gradient algorithm (เบ™เบดเบงเบ•เบฑเบ™)

เบฅเบฐเบšเบปเบšเบงเบดเป€เบ„เบฒเบฐ เบฅเบฐเบ”เบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ‚เบญเบ‡เบ™เบดเบงเบ•เบฑเบ™ เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡เบ™เบดเบงเบ•เบฑเบ™เบ—เบตเปˆเบ–เบทเบเบ”เบฑเบ”เปเบ›เบ‡.
เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบญเบ‡ Newton เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบ›เบฐเบกเบฒเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เปƒเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป‚เบ”เบ polynomial เบ‚เบญเบ‡เบฅเบฐเบ”เบฑเบšเบ—เบตเบชเบญเบ‡:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบšเปˆเบญเบ™เบ—เบตเปˆ SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš เปเบกเปˆเบ™เป€เบกเบ—เบฃเบดเบเบ‚เบญเบ‡เบญเบฐเบ™เบธเบžเบฑเบ™เบ—เบตเบชเบญเบ‡ (Hessian matrix, Hessian).
เบ–เป‰เบฒ Hessian เบกเบตเบ„เบงเบฒเบกเปเบ™เปˆเบ™เบญเบ™เบ”เป‰เบฒเบ™เบšเบงเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบžเบปเบšเป„เบ”เป‰เป‚เบ”เบเบเบฒเบ™เบชเบปเบกเบœเบปเบ™เบ‚เบญเบ‡ gradient เบชเบนเบ™เบ‚เบญเบ‡เบฎเบนเบšเปเบšเบšเบชเบตเปˆเบซเบฅเปˆเบฝเบกเป€เบ›เบฑเบ™เบชเบนเบ™. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบญเบญเบ:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบเบฒเบ™เบ›เบตเป‰เบ™ Hessian เบ–เบทเบเบ„เบดเบ”เป„เบฅเปˆเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ gradient conjugate. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™ Rosenbrock เปเบกเปˆเบ™เปƒเบซเป‰เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เป€เบžเบทเปˆเบญเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ Newton-CG, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆ Hessian.
เบŸเบฑเบ‡เบŠเบฑเบ™ Hessian เบ‚เบญเบ‡ Rosenbrock เปƒเบ™เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบกเปˆเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบšเปˆเบญเบ™เบ—เบตเปˆ SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš ะธ SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เบเปเบฒเบ™เบปเบ” matrix เป„เบ”เป‰ SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบชเบนเบ™เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบ‚เบญเบ‡ matrix เปเบกเปˆเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เบŠเปˆเบญเบ‡เบซเป‰เบฒเบกเบดเบ•เบด N = 5, Hessian matrix เบชเปเบฒเบฅเบฑเบšเบŸเบฑเบ‡เบŠเบฑเบ™ Rosenbrock เบกเบตเบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เปเบ–เบš:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ„เบดเบ”เป„เบฅเปˆ Hessian เบ™เบตเป‰เบžเป‰เบญเบกเบเบฑเบšเบฅเบฐเบซเบฑเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™เบ‚เบญเบ‡ Rosenbrock เป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ conjugate gradient (Newton):

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 arbitrary

เปƒเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡, เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเป‰เปเบฅเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ Hessian matrix เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบงเบฅเบฒเปเบฅเบฐเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบฅเบฐเบšเบธ Matrix Hessian เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เป€เบžเบฒเบฐเบงเปˆเบฒ เบ‚เบฑเป‰เบ™โ€‹เบ•เบญเบ™โ€‹เบเบฒเบ™โ€‹เบซเบผเบธเบ”โ€‹เบœเปˆเบญเบ™โ€‹เบฎเบฝเบโ€‹เบฎเป‰เบญเบ‡โ€‹เปƒเบซเป‰โ€‹เบกเบตโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆ vector เป€เบ—เบปเปˆเบฒโ€‹เบเบฑเบšโ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹เบ•เบฐโ€‹เบžเบฑเบ™โ€‹เบ‚เบญเบ‡ Hessian เบ—เบตเปˆโ€‹เบกเบต vector เบ—เบตเปˆโ€‹เบ•เบปเบ™โ€‹เป€เบญเบ‡โ€‹เบญเบทเปˆเบ™โ€‹. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบˆเบฒเบเบกเบธเบกเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆ, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡ Hessian เบ”เป‰เบงเบ vector arbitrary.

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบŸเบฑเบ‡เบŠเบฑเบ™ hess, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒ vector เบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบ›เบฑเบ™ argument เบ—เปเบฒเบญเบดเบ”, เปเบฅเบฐ vector arbitrary เป€เบ›เบฑเบ™ argument เบ—เบตเบชเบญเบ‡ (เบ„เบฝเบ‡เบ„เบนเปˆเบเบฑเบšเบเบฒเบ™ argument เบญเบทเปˆเบ™เป†เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบˆเบฐ minimized). เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡ Hessian เบ‚เบญเบ‡เบŸเบฑเบ‡เบŠเบฑเบ™ Rosenbrock เบ”เป‰เบงเบ vector arbitrary เบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เบเบฒเบเบซเบผเบฒเบ. เบ–เป‰เบฒ p เป€เบ›เบฑเบ™ vector arbitrary, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš เป€เบšเบดเปˆเบ‡โ€‹เบ„เบท:

SciPy, เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš

เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบ„เบณเบ™เบงเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡ Hessian เปเบฅเบฐ vector arbitrary เบ–เบทเบเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป€เบ›เบฑเบ™เบ„เปˆเบฒเบ‚เบญเบ‡ hessp argument เป„เบ›เบซเบฒเบŸเบฑเบ‡เบŠเบฑเบ™ minimize:

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 เปเบฅเบฐเบ—เบดเบ”เบ—เบฒเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบšเบปเบš gradient algorithm เบ‚เบญเบ‡ Newton เบšเปเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เปƒเบซเป‰ เบงเบดโ€‹เบ—เบตโ€‹เบžเบฒเบโ€‹เบžเบทเป‰เบ™โ€‹เป€เบŠเบทเปˆเบญโ€‹เบ–เบทโ€‹ (trust-region) conjugate Newton gradients.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฑเบšเบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡ 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 arbitrary:

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

เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ trust-ncg, เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเป€เบžเบ” Krylov เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปƒเบŠเป‰เบžเบฝเบ‡เปเบ•เปˆเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ matrix-vector. เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเปƒเบ™เบžเบฒเบเบžเบทเป‰เบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเป€เบŠเบทเปˆเบญเบซเบกเบฑเป‰เบ™เบ—เบตเปˆเบˆเปเบฒเบเบฑเบ”เป‚เบ”เบเบžเบทเป‰เบ™เบ—เบตเปˆเบเปˆเบญเบ Krylov เบ—เบตเปˆเบ–เบทเบเบ•เบฑเบ”เบญเบญเบ. เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบšเปเปˆเปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เบเปเปˆเบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เปƒเบŠเป‰เบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเบ‚เบญเบ‡ nonlinear iterations เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบˆเปเบฒเบ™เบงเบ™เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ matrix-vector เบซเบ™เป‰เบญเบเบฅเบปเบ‡เบ•เปเปˆเบšเบฑเบ™เบซเบฒเบเปˆเบญเบ, เป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ trust-ncg. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบเปˆเบญเบ quadratic เปเบกเปˆเบ™เบžเบปเบšเป€เบซเบฑเบ™เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เบเบงเปˆเบฒเบเบฒเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ trust-ncg.
เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฑเบšเบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡ 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 arbitrary:

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) เปเบกเปˆเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ (เบกเบตเบ•เบปเบงเปเบ›เบซเบผเบฒเบเบžเบฑเบ™เบ•เบปเบง). เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ™เบทเปˆเบญเบ‡เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ algorithm gradient conjugate เบ—เบตเปˆเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบ›เบฐเบกเบฒเบ™เบ‚เบญเบ‡ matrix Hessian inverse. เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™โ€‹เบŠโ€‹เป‰โ€‹เปเบฒโ€‹, เป‚เบ”เบโ€‹เบšเปเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ‚เบฐโ€‹เบซเบเบฒเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹เบŠเบฑเบ”โ€‹เป€เบˆเบ™โ€‹เบ‚เบญเบ‡ Hessian เป„เบ”เป‰โ€‹. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡ Hessian เปเบฅเบฐ vector arbitrary, เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบ”เบตเป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš matrices sparse (เปเบ–เบšเป€เบชเบฑเป‰เบ™เบ‚เบงเบฒเบ‡). เบ™เบตเป‰เบชเบฐเบซเบ™เบญเบ‡เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ•เปˆเปเบฒเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เป€เบงเบฅเบฒเบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™.

เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบซเบฒเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ‡, เบ„เปˆเบฒเปƒเบŠเป‰เบˆเปˆเบฒเบเปƒเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเปเบฅเบฐเบ›เบฑเบ”เป„เบˆ Hessian เปเบกเปˆเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบซเบ™เป‰เบญเบเบฅเบปเบ‡, เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบเปˆเบญเบเบ‚เบญเบ‡เบžเบฒเบเบžเบทเป‰เบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เป€เบเบทเบญเบšเปเบ™เปˆเบ™เบญเบ™. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบšเบฒเบ‡เบชเบปเบกเบœเบปเบ™เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เป€เบชเบฑเป‰เบ™เบ–เบทเบเปเบเป‰เป„เบ‚เบŠเปเป‰เบฒเบ„เบทเบ™เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบšเบฑเบ™เบซเบฒเบเปˆเบญเบเบชเบตเปˆเบซเบฅเปˆเบฝเบก. เบเบฒเบ™เปเบเป‰เป„เบ‚เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบ•เป‰เบญเบ‡เบเบฒเบ™ 3 เบซเบผเบท 4 เบเบฒเบ™ decompositions Cholesky เบ‚เบญเบ‡ Hessian matrix. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบดเบ—เบตเบเบฒเบ™ converges เปƒเบ™ iterations เบซเบ™เป‰เบญเบเบฅเบปเบ‡เปเบฅเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบซเบ™เป‰เบฒเบ—เบตเปˆเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบซเบ™เป‰เบญเบเบเปˆเบงเบฒเบงเบดเบ—เบตเบเบฒเบ™เบžเบฒเบเบžเบทเป‰เบ™เบ„เบงเบฒเบกเบซเบกเบฑเป‰เบ™เปƒเบˆเบญเบทเปˆเบ™เป†เบ›เบฐเบ•เบดเบšเบฑเบ”. เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ™เบตเป‰เบžเบฝเบ‡เปเบ•เปˆเบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ‚เบญเบ‡ Hessian matrix เบ„เบปเบšเบ–เป‰เบงเบ™เบชเบปเบกเบšเบนเบ™เปเบฅเบฐเบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡ Hessian เปเบฅเบฐ vector arbitrary.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ—เปเบฒเบ‡เบฒเบ™ 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. เบŠเบธเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: https://docs.scipy.org/doc/scipy/reference/

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™