SciPy (ãµã€ãã€ãšçºé³) ã¯ãNumpy Python æ¡åŒµæ©èœã«åºã¥ãæ°åŠã¢ããªã±ãŒã·ã§ã³ ããã±ãŒãžã§ãã SciPy ã䜿çšãããšã察話å Python ã»ãã·ã§ã³ããMATLABãIDLãOctaveãR-LabãSciLab ãšåãå®å šãªããŒã¿ ãµã€ãšã³ã¹ããã³è€éãªã·ã¹ãã ãããã¿ã€ãã³ã°ç°å¢ã«ãªããŸãã ä»æ¥ã¯ãscipy.optimize ããã±ãŒãžã§ããç¥ãããŠããæé©åã¢ã«ãŽãªãºã ã䜿çšããæ¹æ³ã«ã€ããŠç°¡åã«èª¬æããããšæããŸãã é¢æ°ã®äœ¿çšã«é¢ãããã詳现ãªææ°ã®ãã«ãã¯ãhelp() ã³ãã³ããŸã㯠Shift+Tab ã䜿çšãããšãã€ã§ãååŸã§ããŸãã
å°å ¥
ããªãèªèº«ãšèªè ãäžæ¬¡æ å ±æºãæ€çŽ¢ãããèªãã ãããæéãçãããã«ãã¡ãœããã®èª¬æãžã®ãªã³ã¯ã¯äž»ã« Wikipedia ã«æ²èŒãããŸãã ååãšããŠããã®æ å ±ã¯ãã¡ãœããã®äžè¬çãªçšèªãšãã®é©çšæ¡ä»¶ãç解ããã®ã«ååã§ãã æ°åŠçææ³ã®æ¬è³ªãç解ããã«ã¯ãåèšäºã®æåŸãŸãã¯ãæ°ã«å ¥ãã®æ€çŽ¢ãšã³ãžã³ã«ãããããä¿¡é Œã§ããåºçç©ãžã®ãªã³ã¯ããã©ã£ãŠãã ããã
ãããã£ãŠãscipy.optimize ã¢ãžã¥ãŒã«ã«ã¯æ¬¡ã®ããã·ãŒãžã£ã®å®è£ ãå«ãŸããŠããŸãã
- ããŸããŸãªã¢ã«ãŽãªãºã (ãã«ããŒã»ããŒãåäœãBFGSããã¥ãŒãã³å
±åœ¹åŸé
ã
ã³ã㩠ОSLSQP ) - ã°ããŒãã«æé©å (äŸ:
çå°å·¡ã ,diff_evolution ) - æ®å·®ã®æå°å
MNC (least_squares) ããã³éç·åœ¢æå°äºä¹æ³ã䜿çšããæ²ç·è¿äŒŒã¢ã«ãŽãªãºã (curve_fit) - XNUMX ã€ã®å€æ°ã®ã¹ã«ã©ãŒé¢æ°ã®æå°å (minim_scalar) ãšæ ¹ã®æ€çŽ¢ (root_scalar)
- ããŸããŸãªã¢ã«ãŽãªãºã (ãã€ããªãã ããŠãšã«ã
ã¬ãŒãã³ããŒã°ïŒãã«ã«ã«ã ãŸãã¯æ¬¡ã®ãããªå€§èŠæš¡ãªæ¹æ³ãã¥ãŒãã³ã»ã¯ãªãã ).
ãã®èšäºã§ã¯ããã®ãªã¹ãå šäœããæåã®é ç®ã®ã¿ãåãäžããŸãã
è€æ°ã®å€æ°ã®ã¹ã«ã©ãŒé¢æ°ã®ç¡æ¡ä»¶æå°å
scipy.optimize ããã±ãŒãžã® minim é¢æ°ã¯ãè€æ°ã®å€æ°ã®ã¹ã«ã©ãŒé¢æ°ã®æ¡ä»¶ä»ãããã³ç¡æ¡ä»¶ã®æå°ååé¡ã解決ããããã®äžè¬çãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã ãããã©ã®ããã«æ©èœãããã瀺ãã«ã¯ãããŸããŸãªæ¹æ³ã§æå°åããããã€ãã®å€æ°ã®é©åãªé¢æ°ãå¿ èŠã§ãã
ãããã®ç®çã«ã¯ã次ã®åœ¢åŒãæ〠N å€æ°ã® Rosenbrock é¢æ°ãæé©ã§ãã
Rosenbrock é¢æ°ãšãã®ã€ã³ãè¡åãšããã»è¡å (ãããã 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)
ããããããããããã«ã3 ã€ã®å€æ°ã®ããŒãŒã³ãããã¯é¢æ°ã®å€ã XNUMXD ã§æç»ããŠã¿ãŸãããã
æç»ã³ãŒã
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 ããããšããŸãã ã¢ã«ãŽãªãºã ã䜿çšããŠãããã«æãè¿ãããŒãŒã³ãããã¯é¢æ°ã®æå°ç¹ãèŠã€ããŠã¿ãŸããã
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.]
ããã€ãã³ã»ãã¬ããã£ãŒã»ãŽãŒã«ããã¡ãŒãã»ã·ã£ã³ã (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]
å ±åœ¹åŸé ã¢ã«ãŽãªãºã (Newton)
ã¢ã«ãŽãªãºã
ãã¥ãŒãã³ã®æ¹æ³ã¯ãå±æé åã®é¢æ°ã XNUMX 次ã®å€é
åŒã§è¿äŒŒããããšã«åºã¥ããŠããŸãã
ã©ã 㯠XNUMX 次å°é¢æ°ã®è¡å (ããã»è¡åãããã»è¡å) ã§ãã
ããã»è¡åãæ£å®å€ã®å Žåãäºæ¬¡åœ¢åŒã®ãŒãåŸé
ããŒããšã¿ãªãããšã«ãã£ãŠããã®é¢æ°ã®æ¥µå°å€ãèŠã€ããããšãã§ããŸãã çµæã¯æ¬¡ã®åŒã«ãªããŸãã
éããã»è¡åã¯ãå
±åœ¹åŸé
æ³ã䜿çšããŠèšç®ãããŸãã ãã®æ¹æ³ã䜿çšããŠããŒãŒã³ãããã¯é¢æ°ãæå°åããäŸã以äžã«ç€ºããŸãã Newton-CG æ³ã䜿çšããã«ã¯ãããã»è¡åãèšç®ããé¢æ°ãæå®ããå¿
èŠããããŸãã
åæ圢åŒã®ããŒãŒã³ãããã¯é¢æ°ã®ããã»è¡åã¯æ¬¡ãšçãããªããŸãã
ã©ã О ãè¡åãå®çŸ©ããŸã .
è¡åã®æ®ãã®éãŒãèŠçŽ ã¯æ¬¡ãšçãããªããŸãã
ããšãã°ã5 次å 空é N = XNUMX ã§ã¯ã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 é¢æ°ãèããŠã¿ãŸãããããã®é¢æ°ã¯ãæå°åãã¯ãã«ãæåã®åŒæ°ãšããŠãä»»æã®ãã¯ãã«ã XNUMX çªç®ã®åŒæ°ãšã㊠(æå°åãããé¢æ°ã®ä»ã®åŒæ°ãšãšãã«) åããŸãã ç§ãã¡ã®å ŽåãRosenbrock é¢æ°ã®ããã»è¡åãšä»»æã®ãã¯ãã«ã®ç©ãèšç®ããããšã¯ããã»ã©é£ãããããŸããã ãã p ãä»»æã®ãã¯ãã«ã®å Žåãç©ã¯ ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
ããã»è¡åãšä»»æã®ãã¯ãã«ã®ç©ãèšç®ããé¢æ°ã¯ãhessp åŒæ°ã®å€ãšã㊠minimum é¢æ°ã«æž¡ãããŸãã
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
å ±åœ¹åŸé ä¿¡é Œé åã¢ã«ãŽãªãºã (Newton)
ããã»è¡åã®æ¡ä»¶ä»ããäžååã§æ€çŽ¢æ¹åãééã£ãŠãããšããã¥ãŒãã³ã®å
±åœ¹åŸé
ã¢ã«ãŽãªãºã ãç¡å¹ã«ãªãå¯èœæ§ããããŸãã ãã®ãããªå Žåã«ã¯ã以äžãåªå
ãããŸãã
ããã»è¡åã®å®çŸ©ã®äŸ:
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 ææ³ãšåæ§ãã¯ãªããåææ³ã¯è¡åãã¯ãã«ã®ç©ã®ã¿ã䜿çšããããã倧èŠæš¡ãªåé¡ã解決ããã®ã«é©ããŠããŸãã ãããã®æ¬è³ªã¯ãåãè©°ããããã¯ãªããéšå空éã«ãã£ãŠå¶éãããä¿¡é Œé åå
ã§åé¡ã解決ããããšã§ãã äžç¢ºå®ãªåé¡ã®å Žåã¯ã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 ã€ã®ã³ã¬ã¹ããŒå解ãå¿ èŠã§ãã ãã®çµæããã®æ¹æ³ã¯ããå°ãªãå埩åæ°ã§åæããä»ã®å®è£ ãããä¿¡é Œé åæ¹æ³ãããå¿ èŠãªç®çé¢æ°ã®èšç®ãå°ãªããªããŸãã ãã®ã¢ã«ãŽãªãºã ã«ã¯å®å šãªããã»è¡åã®æ±ºå®ã®ã¿ãå«ãŸããŠãããããã»è¡åãšä»»æã®ãã¯ãã«ã®ç©é¢æ°ã䜿çšããæ©èœã¯ãµããŒããããŠããŸããã
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.])
ããããããã§æ¢ãŸãã§ãããã 次ã®èšäºã§ã¯ãæ¡ä»¶ä»ãæå°åãè¿äŒŒåé¡ã解ãéã®æå°åã®å¿çšãXNUMX å€æ°ã®é¢æ°ã®æå°åãä»»æã®ãããã€ã¶ãŒãããã³ scipy.optimize ã䜿çšããæ¹çšåŒç³»ã®æ ¹ã®æ€çŽ¢ã«ã€ããŠãæãèå³æ·±ãããšã説æããããšæããŸããããã±ãŒãžã
åºæïŒ
åºæïŒ habr.com