SciPy(sai Pie๋ก ๋ฐ์)๋ Numpy Python ํ์ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ํ ์ ํ๋ฆฌ์ผ์ด์ ํจํค์ง์ ๋๋ค. SciPy๋ฅผ ์ฌ์ฉํ๋ฉด ๋ํํ Python ์ธ์ ์ด MATLAB, IDL, Octave, R-Lab ๋ฐ SciLab๊ณผ ๋์ผํ ์์ ํ ๋ฐ์ดํฐ ๊ณผํ ๋ฐ ๋ณต์กํ ์์คํ ํ๋กํ ํ์ ์ ์ ํ๊ฒฝ์ด ๋ฉ๋๋ค. ์ค๋ ์ ๋ scipy.optimize ํจํค์ง์์ ์ ์๋ ค์ง ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ๋ตํ๊ฒ ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. ๊ธฐ๋ฅ ์ฌ์ฉ์ ๋ํ ๋ ์์ธํ ์ต์ ๋์๋ง์ ์ธ์ ๋ ์ง help() ๋ช ๋ น์ ์ฌ์ฉํ๊ฑฐ๋ Shift+Tab์ ์ฌ์ฉํ์ฌ ์ป์ ์ ์์ต๋๋ค.
์๊ฐ
์์ ๊ณผ ๋ ์๊ฐ ์ฃผ์ ์์ค๋ฅผ ๊ฒ์ํ๊ณ ์ฝ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฐฉ๋ฒ ์ค๋ช ์ ๋ํ ๋งํฌ๋ ์ฃผ๋ก Wikipedia์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ์ ๋ณด๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด ๋ฐ ์ ์ฉ ์กฐ๊ฑด์ ์ดํดํ๋ ๋ฐ ์ถฉ๋ถํฉ๋๋ค. ์ํ์ ๋ฐฉ๋ฒ์ ๋ณธ์ง์ ์ดํดํ๋ ค๋ฉด ๊ฐ ๊ธฐ์ฌ์ ๋์ด๋ ์ฆ๊ฒจ ์ฌ์ฉํ๋ ๊ฒ์ ์์ง์์ ์ฐพ์ ์ ์๋ ๋ณด๋ค ๊ถ์ ์๋ ์ถํ๋ฌผ์ ๋งํฌ๋ฅผ ๋ฐ๋ฅด์ญ์์ค.
๋ฐ๋ผ์ scipy.optimize ๋ชจ๋์๋ ๋ค์ ์ ์ฐจ์ ๊ตฌํ์ด ํฌํจ๋ฉ๋๋ค.
- ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ(Nelder-Mead Simplex, BFGS, Newton Conjugate Gradients,
์ฝ๋น๋ผ ะธSLSQP ) - ์ ์ญ ์ต์ ํ(์:
์ ์ญ ํธํ ,diff_evolution ) - ์์ฐจ ์ต์ํ
MNC (least_squares) ๋ฐ ๋น์ ํ ์ต์ ์ ๊ณฑ์ ์ฌ์ฉํ ๊ณก์ ํผํ ์๊ณ ๋ฆฌ์ฆ(curve_fit) - ํ ๋ณ์(minim_scalar)์ ์ค์นผ๋ผ ํจ์ ์ต์ํ ๋ฐ ๋ฃจํธ ๊ฒ์(root_scalar)
- ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ(ํ์ด๋ธ๋ฆฌ๋ Powell,
Levenberg-Marquardt ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋๊ท๋ชจ ๋ฐฉ๋ฒ๋ดํด-ํฌ๋ฆด๋กํ ).
์ด ๊ธฐ์ฌ์์๋ ์ ์ฒด ๋ชฉ๋ก ์ค ์ฒซ ๋ฒ์งธ ํญ๋ชฉ๋ง ๊ณ ๋ คํ ๊ฒ์ ๋๋ค.
์ฌ๋ฌ ๋ณ์์ ์ค์นผ๋ผ ํจ์๋ฅผ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ์ต์ํ
scipy.optimize ํจํค์ง์ minim ํจ์๋ ์ฌ๋ฌ ๋ณ์์ ์ค์นผ๋ผ ํจ์์ ์กฐ๊ฑด๋ถ ๋ฐ ๋ฌด์กฐ๊ฑด์ ์ต์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ผ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ๋ณ์์ ์ ์ ํ ํจ์๊ฐ ํ์ํ๋ฉฐ ์ด๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ํํ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋ชฉ์ ์ ์ํด N ๋ณ์์ Rosenbrock ํจ์๋ ์๋ฒฝํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ํ์์ ๊ฐ์ต๋๋ค.
Rosenbrock ํจ์์ ํด๋น Jacobi ๋ฐ Hessian ํ๋ ฌ(๊ฐ๊ฐ XNUMX์ฐจ ๋ฐ XNUMX์ฐจ ๋ํจ์)์ด 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์ฐจ์ ๊ณต๊ฐ์ ์ด๊ธฐ์ 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 ๋ฐฉ๋ฒ์ ๊ฐ๋จํ ์ต์ํ ๋ฌธ์ ์ ์ ํฉํ ์ ํ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ์ธ๊ธฐ ์ถ์ ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ต์๊ฐ์ ์ฐพ๋ ๋ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
ํ์ ๋ฐฉ๋ฒ
ํจ์๊ฐ๋ง ๊ณ์ฐํ๋ ๋ ๋ค๋ฅธ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์
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
๊ธฐ์ธ๊ธฐ ๊ณ์ฐ ํจ์๋ ์๋์ ๊ฐ์ด minim ํจ์์ 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]
์ผค๋ ๊ธฐ์ธ๊ธฐ ์๊ณ ๋ฆฌ์ฆ(๋ดํด)
์ฐ์ฐ
๋ดํด์ ๋ฐฉ๋ฒ์ XNUMX์ฐจ ๋คํญ์์ผ๋ก ๋ก์ปฌ ์์ญ์ ํจ์๋ฅผ ๊ทผ์ฌํ๋ ๋ฐ ๊ธฐ๋ฐ์ ๋๊ณ ์์ต๋๋ค.
์ด๋์์ ๋ XNUMX์ฐจ ๋ํจ์ ํ๋ ฌ(Hessian ํ๋ ฌ, Hessian)์
๋๋ค.
ํค์ธ ํ๋ ฌ์ด ์์ ์ ๋ถํธ์ธ ๊ฒฝ์ฐ ์ด ํจ์์ ๊ตญ์ ์ต์๊ฐ์ XNUMX์ฐจ ํ์์ XNUMX ๊ธฐ์ธ๊ธฐ๋ฅผ XNUMX๊ณผ ๋์ผ์ํ์ฌ ์ฐพ์ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ญ ํค์ธ ํ๋ ฌ์ ์ผค๋ ๊ธฐ์ธ๊ธฐ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค. Rosenbrock ํจ์๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. Newton-CG ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ค๋ฉด ํค์ธ ํ๋ ฌ์ ๊ณ์ฐํ๋ ํจ์๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
๋ถ์ ํ์์ Rosenbrock ํจ์์ ํค์ธ ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด๋์์ ะธ , ํ๋ ฌ์ ์ ์ .
ํ๋ ฌ์ XNUMX์ด ์๋ ๋๋จธ์ง ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ค์ด, 5์ฐจ์ ๊ณต๊ฐ N = XNUMX์์ Rosenbrock ํจ์์ ๋ํ ํค์ธ ํ๋ ฌ์ ๋ฐด๋ ํํ๋ฅผ ๊ฐ์ต๋๋ค.
์ผค๋ ๊ธฐ์ธ๊ธฐ(๋ดํด) ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ 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]
ํค์ธ ํ๋ ฌ์ ๊ณฑ ํจ์ ์ ์์ ์์ ๋ฒกํฐ์ ์
์ค์ ๋ฌธ์ ์์ ์ ์ฒด ํค์ธ ํ๋ ฌ์ ๊ณ์ฐํ๊ณ ์ ์ฅํ๋ ค๋ฉด ์๋นํ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ค์ ๋ก ํค์ธ ํ๋ ฌ ์์ฒด๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ต์ํ ์ ์ฐจ์๋ ํค์ธ ํ๋ ฌ๊ณผ ๋ค๋ฅธ ์์ ๋ฒกํฐ์ ๊ณฑ๊ณผ ๋์ผํ ๋ฒกํฐ๋ง ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ณ์ฐ์ ์ธ ๊ด์ ์์๋ ํค์ธ ํ๋ ฌ๊ณผ ์์์ ๋ฒกํฐ๋ฅผ ๊ณฑํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ์ฆ์ ์ ์ํ๋ ๊ฒ์ด ํจ์ฌ ๋ฐ๋์งํฉ๋๋ค.
์ต์ํ ๋ฒกํฐ๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก, ์์์ ๋ฒกํฐ๋ฅผ ๋ ๋ฒ์งธ ์ธ์๋ก(์ต์ํํ ํจ์์ ๋ค๋ฅธ ์ธ์์ ํจ๊ป) ์ฌ์ฉํ๋ hess ํจ์๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ ์์์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ์ฌ Rosenbrock ํจ์์ ํค์ธ ํ๋ ฌ์ ๊ณฑ์ ๊ณ์ฐํ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ต๋๋ค. ๋ง์ฝ์ p ๋ ์์์ ๋ฒกํฐ์ด๋ฉด ๊ณฑ์ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํค์ธ ํ๋ ฌ๊ณผ ์์ ๋ฒกํฐ์ ๊ณฑ์ ๊ณ์ฐํ๋ ํจ์๋ 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.]
Krylov ์ ํ ๋ฐฉ๋ฒ
trust-ncg ๋ฐฉ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Krylov ์ ํ ๋ฐฉ๋ฒ์ ํ๋ ฌ-๋ฒกํฐ ๊ณฑ๋ง ์ฌ์ฉํ๋ฏ๋ก ๋๊ท๋ชจ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ๊ทธ๋ค์ ๋ณธ์ง์ ์๋ฆฐ Krylov ๋ถ๋ถ ๊ณต๊ฐ์ผ๋ก ์ ํ๋๋ ์ ๋ขฐ ์์ญ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์
๋๋ค. ๋ถํ์คํ ๋ฌธ์ ์ ๊ฒฝ์ฐ์๋ trust-ncg ๋ฐฉ๋ฒ์ ๋นํด ํ์ ๋ฌธ์ ๋น ํ๋ ฌ-๋ฒกํฐ ๊ณฑ์ ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋ ์ ์ ์์ ๋น์ ํ ๋ฐ๋ณต์ ์ฌ์ฉํ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๋ํ, trust-ncg ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค XNUMX์ฐจ ํ์ ๋ฌธ์ ์ ๋ํ ํด๋ฅผ ๋ ์ ํํ๊ฒ ๊ตฌํฉ๋๋ค.
ํค์ธ ํ๋ ฌ ์ ์์ ์:
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~XNUMXํ ํ์ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ๋ฐฉ๋ฒ์ ๊ตฌํ๋ ๋ค๋ฅธ ์ ๋ขฐ ์์ญ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ์ ์ ๋ฐ๋ณต ํ์๋ก ์๋ ดํ๊ณ ๋ ์ ์ ๋ชฉ์ ํจ์ ๊ณ์ฐ์ด ํ์ํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ ํ ํค์ธ ํ๋ ฌ์ ๊ฒฐ์ ๋ง์ ์๋ฏธํ๋ฉฐ ํค์ธ ํ๋ ฌ๊ณผ ์์ ๋ฒกํฐ์ ๊ณฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค.
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๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฉ์ ์ ์์คํ ์ ๊ทผ ์ฐพ๊ธฐ์ ๋ํด ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ด์ฉ์ ์ค๋ช ํ๋ ค๊ณ ํฉ๋๋ค. ํจํค์ง.
์ถ์ฒ :
์ถ์ฒ : habr.com