SciPy (උච්චාරණය sai pie) යනු Numpy Python දිගුව මත පදනම් වූ ගණිතමය යෙදුම් පැකේජයකි. SciPy සමඟින්, ඔබේ අන්තර්ක්රියාකාරී Python සැසිය MATLAB, IDL, Octave, R-Lab, සහ SciLab වැනි සම්පූර්ණ දත්ත විද්යාව සහ සංකීර්ණ පද්ධති මූලාකෘති පරිසරය බවට පත්වේ. අද මම කෙටියෙන් කතා කරන්න බලාපොරොත්තු වෙන්නේ scipy.optimize පැකේජයේ සුප්රසිද්ධ ප්රශස්තිකරණ ඇල්ගොරිතම කිහිපයක් භාවිතා කරන ආකාරය ගැනයි. කාර්යයන් භාවිතා කිරීම පිළිබඳ වඩාත් සවිස්තරාත්මක සහ යාවත්කාලීන උපකාර සෑම විටම help() විධානය භාවිතයෙන් හෝ Shift+Tab භාවිතයෙන් ලබා ගත හැක.
හැඳින්වීම
ප්රාථමික මූලාශ්ර සෙවීමෙන් සහ කියවීමෙන් ඔබව සහ පාඨකයින් බේරා ගැනීම සඳහා, ක්රම පිළිබඳ විස්තර සඳහා සබැඳි ප්රධාන වශයෙන් විකිපීඩියාවේ ඇත. රීතියක් ලෙස, මෙම තොරතුරු සාමාන්ය පදවල ක්රම සහ ඒවායේ යෙදුම සඳහා කොන්දේසි තේරුම් ගැනීමට ප්රමාණවත් වේ. ගණිතමය ක්රමවල සාරය අවබෝධ කර ගැනීම සඳහා, එක් එක් ලිපියේ අවසානයේ හෝ ඔබේ ප්රියතම සෙවුම් යන්ත්රයේ සොයා ගත හැකි වඩාත් බලයලත් ප්රකාශන වෙත සබැඳි අනුගමනය කරන්න.
එබැවින්, scipy.optimize මොඩියුලයට පහත ක්රියා පටිපාටි ක්රියාත්මක කිරීම ඇතුළත් වේ:
- විවිධ ඇල්ගොරිතම (Nelder-Mead simplex, BFGS, Newton conjugate gradients, භාවිතා කරමින් විචල්ය කිහිපයක (අවම) පරිමාණ ශ්රිතවල කොන්දේසි සහිත සහ කොන්දේසි විරහිතව අවම කිරීම
කෝබිලා иSLSQP ) - ගෝලීය ප්රශස්තකරණය (උදාහරණයක් ලෙස:
basinhopping ,diff_evolution ) - අවශේෂ අවම කිරීම
MNC (අවම_චතුරස්ර) සහ රේඛීය නොවන අවම කොටු (curve_fit) භාවිතයෙන් වක්ර සවි කිරීමේ ඇල්ගොරිතම - එක් විචල්යයක අදිශ ශ්රිත අවම කිරීම (අවම_පරිමාණ) සහ මූලයන් සෙවීම (root_scalar)
- විවිධ ඇල්ගොරිතම (දෙමුහුන් පවෙල්,) භාවිතා කරමින් සමීකරණ පද්ධතියේ (මූල) බහුමාන විසඳුම්
Levenberg-Marquardt හෝ වැනි මහා පරිමාණ ක්රමනිව්ටන්-ක්රයිලොව් ).
මෙම ලිපියෙන් අපි මෙම සම්පූර්ණ ලැයිස්තුවෙන් පළමු අයිතමය පමණක් සලකා බලමු.
විචල්ය කිහිපයක අදිශ ශ්රිතයක් කොන්දේසි විරහිතව අවම කිරීම
scipy.optimize පැකේජයේ ඇති අවම ශ්රිතය විචල්ය කිහිපයක අදිශ ශ්රිතවල කොන්දේසි සහිත සහ කොන්දේසි විරහිත අවම කිරීමේ ගැටළු විසඳීම සඳහා සාමාන්ය අතුරු මුහුණතක් සපයයි. එය ක්රියා කරන ආකාරය නිරූපණය කිරීම සඳහා, අපට විචල්ය කිහිපයක සුදුසු ශ්රිතයක් අවශ්ය වනු ඇත, එය අපි විවිධ ආකාරවලින් අවම කරනු ඇත.
මෙම අරමුණු සඳහා, N විචල්යවල Rosenbrock ශ්රිතය පරිපූර්ණ වේ, එහි ආකෘතිය ඇත:
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)
පැහැදිලිකම සඳහා, විචල්ය දෙකක 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()
අවම අගය 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 ශ්රිතයේ ව්යුත්පන්නය විශ්ලේෂණාත්මක ආකාරයෙන් සොයා ගනිමු:
මෙම ප්රකාශනය පළමු සහ අවසාන හැර අනෙකුත් සියලුම විචල්යවල ව්යුත්පන්නයන් සඳහා වලංගු වේ, ඒවා ලෙස අර්ථ දක්වා ඇත:
මෙම අනුක්රමය ගණනය කරන පයිතන් ශ්රිතය දෙස බලමු:
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]
සංයුක්ත අනුක්රමණ ඇල්ගොරිතම (නිව්ටන්)
ඇල්ගොරිතම
නිව්ටන්ගේ ක්රමය පදනම් වී ඇත්තේ ප්රාදේශීය ප්රදේශයක ශ්රිතයක් දෙවන උපාධියේ බහුපදයකින් ආසන්න කිරීම මත ය:
එහිදී දෙවන ව්යුත්පන්න වල න්යාසයයි (Hessian matrix, Hessian).
Hessian ධනාත්මක නිශ්චිත නම්, මෙම ශ්රිතයේ දේශීය අවම අගය චතුරස්ර ආකෘතියේ ශුන්ය අනුක්රමණය ශුන්යයට සමාන කිරීමෙන් සොයාගත හැක. ප්රතිඵලය ප්රකාශනය වනු ඇත:
ප්රතිලෝම Hessian ගණනය කරනු ලබන්නේ conjugate gradient ක්රමය භාවිතා කරමිනි. Rosenbrock කාර්යය අවම කිරීම සඳහා මෙම ක්රමය භාවිතා කිරීමේ උදාහරණයක් පහත දැක්වේ. Newton-CG ක්රමය භාවිතා කිරීම සඳහා, ඔබ Hessian ගණනය කරන කාර්යයක් සඳහන් කළ යුතුය.
විශ්ලේෂණාත්මක ස්වරූපයෙන් Rosenbrock ශ්රිතයේ Hessian සමාන වේ:
එහිදී и , matrix නිර්වචනය කරන්න .
න්යාසයේ ඉතිරි ශුන්ය නොවන මූලද්රව්ය සමාන වේ:
උදාහරණයක් ලෙස, පංචමාන අවකාශයක N = 5, Rosenbrock ශ්රිතය සඳහා Hessian න්යාසය පටියක ස්වරූපය ඇත:
මෙම 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 සහ අත්තනෝමතික දෛශිකයේ නිෂ්පාදන කාර්යයේ නිර්වචනය සමඟ උදාහරණයක්
සැබෑ ලෝකයේ ගැටළු වලදී, සම්පූර්ණ Hessian matrix ගණනය කිරීම සහ ගබඩා කිරීම සඳහා සැලකිය යුතු කාලයක් සහ මතක සම්පත් අවශ්ය වේ. මෙම අවස්ථාවෙහිදී, ඇත්ත වශයෙන්ම Hessian matrix සඳහන් කිරීමට අවශ්ය නොවේ, මන්ද අවම කිරීමේ ක්රියා පටිපාටියට අවශ්ය වන්නේ වෙනත් අත්තනෝමතික දෛශිකයක් සහිත හෙසියන් ගුණිතයට සමාන දෛශිකයක් පමණි. මේ අනුව, ගණනය කිරීමේ දෘෂ්ටි කෝණයකින්, අත්තනෝමතික දෛශිකයක් සමඟ හෙසියන් නිෂ්පාදනයේ ප්රතිඵලය ආපසු ලබා දෙන ශ්රිතයක් වහාම නිර්වචනය කිරීම වඩාත් සුදුසුය.
පළමු තර්කය ලෙස අවම කිරීමේ දෛශිකය සහ දෙවන තර්කය ලෙස හිතුවක්කාර දෛශිකය (අවම කළ යුතු ශ්රිතයේ අනෙකුත් තර්ක සමඟ) ගන්නා හෙස් ශ්රිතය සලකා බලන්න. අපගේ නඩුවේදී, අත්තනෝමතික දෛශිකයක් සමඟ Rosenbrock ශ්රිතයේ Hessian හි නිෂ්පාදිතය ගණනය කිරීම ඉතා අපහසු නොවේ. නම් p අත්තනෝමතික දෛශිකයක් වේ, පසුව නිෂ්පාදිතය පෙනෙන්නේ:
Hessian සහ අත්තනෝමතික දෛශිකයේ ගුණිතය ගණනය කරන ශ්රිතය 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
සංයුජ අනුක්රමික විශ්වාස කලාප ඇල්ගොරිතම (නිව්ටන්)
Hessian matrix හි දුර්වල සමීකරණය සහ වැරදි සෙවුම් දිශාවන් නිසා Newton ගේ conjugate gradient algorithm අකාර්යක්ෂම විය හැක. එවැනි අවස්ථාවන්හිදී, මනාප ලබා දෙනු ලැබේ
හෙසියානු අනුකෘතියේ නිර්වචනය සමඟ උදාහරණය:
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 සහ අත්තනෝමතික දෛශිකයේ නිෂ්පාදන කාර්යය සමඟ උදාහරණයක්:
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 ක්රමය මෙන්, ක්රයිලොව්-වර්ගයේ ක්රම මහා පරිමාණ ගැටළු විසඳීම සඳහා හොඳින් ගැලපේ, මන්ද ඒවා matrix-vector නිෂ්පාදන පමණක් භාවිතා කරයි. ඔවුන්ගේ සාරය නම් කැපූ ක්රයිලොව් උප අවකාශයකින් සීමා වූ විශ්වාස කලාපයක ගැටලුවක් විසඳීමයි. අවිනිශ්චිත ගැටළු සඳහා, විශ්වාස-ncg ක්රමයට සාපේක්ෂව උප ගැටලුවකට matrix-vector නිෂ්පාදන කුඩා සංඛ්යාවක් හේතුවෙන් රේඛීය නොවන පුනරාවර්තන කුඩා සංඛ්යාවක් භාවිතා කරන බැවින්, මෙම ක්රමය භාවිතා කිරීම වඩා හොඳය. මීට අමතරව, quadratic subproblem සඳහා විසඳුම 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.]
Hessian සහ අත්තනෝමතික දෛශිකයේ නිෂ්පාදන කාර්යය සමඟ උදාහරණයක්:
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) මහා පරිමාණ ගැටළු විසඳීම සඳහා (විචල්ය දහස් ගණනක් සමඟ) හොඳින් ගැලපේ. මෙයට හේතුව වන්නේ යටින් පවතින සංයුජ අනුක්රමණ ඇල්ගොරිතමයෙන් ප්රතිලෝම හෙසියානු න්යාසයේ ආසන්න නිර්ණය කිරීමයි. Hessian හි පැහැදිලි ප්රසාරණයකින් තොරව විසඳුම පුනරාවර්තන ලෙස සොයාගත හැකිය. ඔබට Hessian සහ අත්තනෝමතික දෛශිකයක නිෂ්පාදනයක් සඳහා ශ්රිතයක් පමණක් අර්ථ දැක්වීමට අවශ්ය වන බැවින්, මෙම ඇල්ගොරිතම විරල (කලාප විකර්ණ) matrices සමඟ වැඩ කිරීම සඳහා විශේෂයෙන් හොඳය. මෙය අඩු මතක පිරිවැයක් සහ සැලකිය යුතු කාලයක් ඉතිරි කරයි.
මධ්යම ප්රමාණයේ ගැටළු සඳහා, හෙසියන් ගබඩා කිරීමේ හා සාධක කිරීමේ පිරිවැය තීරණාත්මක නොවේ. මෙයින් අදහස් කරන්නේ විශ්වාස කලාපයේ උප ගැටළු හරියටම පාහේ විසඳමින් අඩු පුනරාවර්තන වලින් විසඳුමක් ලබා ගත හැකි බවයි. මෙය සිදු කිරීම සඳහා, සමහර රේඛීය නොවන සමීකරණ එක් එක් චතුර් උප ගැටලුව සඳහා පුනරාවර්තන ලෙස විසඳනු ලැබේ. එවැනි විසඳුමක් සඳහා සාමාන්යයෙන් Hessian matrix හි Cholesky විසංයෝජනයන් 3 හෝ 4 ක් අවශ්ය වේ. එහි ප්රතිඵලයක් වශයෙන්, ක්රමය අඩු පුනරාවර්තන වලින් අභිසාරී වන අතර අනෙකුත් ක්රියාත්මක කළ විශ්වාස කලාප ක්රමවලට වඩා අඩු වෛෂයික ශ්රිත ගණනය කිරීම් අවශ්ය වේ. මෙම ඇල්ගොරිතමයට සම්පූර්ණ Hessian matrix නිර්ණය කිරීම පමණක් ඇතුළත් වන අතර Hessian සහ අත්තනෝමතික දෛශිකයේ නිෂ්පාදන කාර්යය භාවිතා කිරීමේ හැකියාව සඳහා සහාය නොදක්වයි.
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 භාවිතා කර සමීකරණ පද්ධතියක මූලයන් සෙවීම පිළිබඳ වඩාත් රසවත් කරුණු පැවසීමට ය. පැකේජය.
මූලාශ්රය:
මූලාශ්රය: www.habr.com