SciPy, оптимизация

SciPy, оптимизация

SciPy (произнася сС sai pai) Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ с матСматичСски прилоТСния, Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Numpy Python. Бъс SciPy Π΅Π΄Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Π° Python сСсия сС ΠΏΡ€Π΅Π²Ρ€ΡŠΡ‰Π° Π² ΡΡŠΡ‰Π°Ρ‚Π° пълна срСда Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ слоТна ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ½Π° срСда ΠΊΠ°Ρ‚ΠΎ MATLAB, IDL, Octave, R-Lab ΠΈ SciLab. ДнСс искам Π΄Π° говоря Π½Π°ΠΊΡ€Π°Ρ‚ΠΊΠΎ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ° някои Π΄ΠΎΠ±Ρ€Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° оптимизация Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize. По-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π° ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π° ΠΏΠΎΠΌΠΎΡ‰ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Ρ‡Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° help() ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· Shift+Tab.

въвСдСниС

Π—Π° Π΄Π° спСстя сСбС си ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ ΠΈ Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π° ΠΏΡŠΡ€Π²ΠΎΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ, Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ към описанията Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΌΠ½ΠΎ Π² Wikipedia. По ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Ρ‚Π°Π·ΠΈ информация Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π° Π·Π° Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π² ΠΎΠ±Ρ‰ΠΈ Π»ΠΈΠ½ΠΈΠΈ ΠΈ условията Π·Π° тяхното ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅. Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΡΡŠΡ‰Π½ΠΎΡΡ‚Ρ‚Π° Π½Π° матСматичСскитС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ, слСдвамС Π²Ρ€ΡŠΠ·ΠΊΠΈΡ‚Π΅ към ΠΏΠΎ-Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² края Π½Π° всяка статия ΠΈΠ»ΠΈ Π² Π»ΡŽΠ±ΠΈΠΌΠ°Ρ‚Π° Π²ΠΈ Ρ‚ΡŠΡ€ΡΠ°Ρ‡ΠΊΠ°.

И Ρ‚Π°ΠΊΠ°, ΠΌΠΎΠ΄ΡƒΠ»ΡŠΡ‚ scipy.optimize Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° слСднитС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ:

  1. Условно ΠΈ бСзусловно ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° скаларни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ (ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ) с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ (симплСкс Π½Π° Nelder-Mead, BFGS, ΠΊΠΎΠ½ΡŽΠ³ΠΈΡ€Π°Π½ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ Π½Π° ΠΡŽΡ‚ΠΎΠ½, ΠšΠžΠ‘Π˜Π›Π ΠΈ SLSQP)
  2. Π“Π»ΠΎΠ±Π°Π»Π½Π° оптимизация (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: басСйнови Ρ…ΡŠΠ»ΠΌΠΎΠ²Π΅, diff_evolution)
  3. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅ MNC (least_squares) ΠΈ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° напасванС Π½Π° ΠΊΡ€ΠΈΠ²Π°Ρ‚Π° Π½Π° Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΈΡ‚Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈ (curve_fit)
  4. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° скаларни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π΅Π΄Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° (minim_scalar) ΠΈ Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠΎΡ€Π΅Π½ΠΈ (root_scalar)
  5. Π Π΅ΡˆΠ°Π²Π°Ρ‚Π΅Π»ΠΈ Π½Π° систСми с ΠΌΠ½ΠΎΠ³ΠΎΠ²Π°Ρ€ΠΈΠ°Π½Ρ‚Π½ΠΈ уравнСния (root), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ (Hybrid Powell, Π›Π΅Π²Π΅Π½Π±Π΅Ρ€Π³-ΠœΠ°Ρ€ΠΊΠ²Π°Ρ€Π΄ ΠΈΠ»ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎΠΌΠ°Ρ‰Π°Π±Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ ΠΡŽΡ‚ΠΎΠ½-ΠšΡ€ΠΈΠ»ΠΎΠ²).

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ само ΠΏΡŠΡ€Π²ΠΈΡ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ цСлия Ρ‚ΠΎΠ·ΠΈ списък.

БСзусловно ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° скаларна функция Π½Π° няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ

Ѐункцията minim ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize прСдоставя ΠΎΠ±Ρ‰ интСрфСйс Π·Π° условно ΠΈ бСзусловно ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° скаларни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ. Π—Π° Π΄Π° дСмонстрирамС Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° ΠΌΡƒ, сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ‚ подходяща функция ΠΎΡ‚ няколко ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½Π°Ρ‡ΠΈΠ½ΠΈ.

Π—Π° Ρ‚Π΅Π·ΠΈ Ρ†Π΅Π»ΠΈ функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ ΠΎΡ‚ N ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π΅ ΠΏΠ΅Ρ€Ρ„Π΅ΠΊΡ‚Π½Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

SciPy, оптимизация

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ ΠΈ Π½Π΅ΠΉΠ½ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†ΠΈ Π½Π° Π―ΠΊΠΎΠ±ΠΈ ΠΈ Π₯СсС (ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ Π½Π° ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΠΈ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°) Π²Π΅Ρ‡Π΅ са Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° 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 стойноститС Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ Π½Π° Π΄Π²Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ.

Код Π·Π° изобразяванС

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

НСка ΠΈΠΌΠ° Π½Π°Ρ‡Π°Π»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° x0 Π² 5-ΠΈΠ·ΠΌΠ΅Ρ€Π½ΠΎΡ‚ΠΎ пространство. НамСрСтС Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠ°Ρ‚Π° Π΄ΠΎ нСя ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° 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 Π΅ Π΄ΠΎΠ±ΡŠΡ€ ΠΈΠ·Π±ΠΎΡ€ Π·Π° прости ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅. Въй ΠΊΠ°Ρ‚ΠΎ ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°, Π½Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΡ‚Π½Π΅ΠΌΠ΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠŸΠ°ΡƒΡŠΠ»

Π”Ρ€ΡƒΠ³ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° оптимизация, ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ сС изчисляват само стойноститС Π½Π° функцията, Π΅ ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠŸΠ°ΡƒΡŠΠ». Π—Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅, трябва Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ method = 'powell' във функцията minim.

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

Π—Π° Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΏΠΎ-Π±ΡŠΡ€Π·Π° конвСргСнция към Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ‚Π° 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 Π½Π° функцията minim, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ.

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, оптимизация

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΈΡΡ‚ хСсиан сС изчислява с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° спрСгнатия Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ Π΅ Π΄Π°Π΄Π΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ. Π—Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Newton-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, оптимизация

Ѐункцията, която изчислява ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π₯Ссиан ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π²Π΅ΠΊΡ‚ΠΎΡ€, сС ΠΏΡ€Π΅Π΄Π°Π²Π° ΠΊΠ°Ρ‚ΠΎ стойност Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° 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

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° Π΄ΠΎΠ²Π΅Ρ€Π΅Π½ Ρ€Π΅Π³ΠΈΠΎΠ½ Π·Π° ΠΊΠΎΠ½ΡŽΠ³ΠΈΡ€Π°Π½ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ (ΠΡŽΡ‚ΠΎΠ½)

Π›ΠΎΡˆΠ°Ρ‚Π° условност Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° Π₯Ссиан ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈΡ‚Π΅ посоки Π½Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π°Ρ‚ Π΄ΠΎ нССфСктивността Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π½Π° ΠΊΠΎΠ½ΡŽΠ³ΠΈΡ€Π°Π½ΠΈΡ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π° ΠΡŽΡ‚ΠΎΠ½. Π’ Ρ‚Π°ΠΊΠΈΠ²Π° случаи сС Π΄Π°Π²Π° прСдимство ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° Π΄ΠΎΠ²Π΅Ρ€Π΅Π½ Ρ€Π΅Π³ΠΈΠΎΠ½ (trust-region) ΠΡŽΡ‚ΠΎΠ½ΠΎΠ²ΠΈ спрСгнати Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с дСфиницията Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° Π₯Ссиан:

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 Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° Π₯олСски Π₯Ссиан. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ сС сблиТава Π² ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ изисква ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ изчислСниС Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΠ²Π½Π° функция Π² сравнСниС с Π΄Ρ€ΡƒΠ³ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ Π·Π° Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»Π΅Π½ Ρ€Π΅Π³ΠΈΠΎΠ½. Π’ΠΎΠ·ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° само Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡŠΠ»Π½Π°Ρ‚Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π½Π° Π₯Ссиан ΠΈ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° функцията Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π₯Ссиан ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ Π²Π΅ΠΊΡ‚ΠΎΡ€.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ:

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€