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

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

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

Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅

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

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

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

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

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

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

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

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

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° Π―ΠΊΠΎΠ±ΠΈ ΠΈ Π₯Сс (ΠΏΡŠΡ€Π²ΠΈ ΠΈ Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ) Π²Π΅Ρ‡Π΅ са Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½ΠΈ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize, Ρ‰Π΅ я Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ сами.

import numpy as np

def rosen(x):
    """Ѐункцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ"""
    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, оптимизация, Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π°Ρ‚Π° стойност Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΈ scipy.optimize.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π° симплСкс Π½Π° ΠΠ΅Π»Π΄ΡŠΡ€-Мийд (Nelder-Mead)

НСка ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°Ρ‡Π°Π»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° x0 Π² 5-ΠΈΠ·ΠΌΠ΅Ρ€Π½ΠΎ пространство. Π©Π΅ Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ Π½Π°ΠΉ-Π±Π»ΠΈΠ·ΠΊΠ°Ρ‚Π° Π΄ΠΎ нСя Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΡ€Π° симплСкса НСлдСр-Мийд (Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ Π΅ ΡƒΠΊΠ°Π·Π°Π½ ΠΊΠ°Ρ‚ΠΎ стойност Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° method):

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)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 339
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 571
[1. 1. 1. 1. 1.]

ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π½Π° симплСкс Π΅ Π½Π°ΠΉ-простият Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° явно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΈ сравнитСлно Π³Π»Π°Π΄ΠΊΠ° функция. НС изисква изчисляванС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ Π½Π° функцията, Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ само Π½Π΅ΠΉΠ½ΠΈΡ‚Π΅ стойности. ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π½Π° НСлдСр-Мийд Π΅ Π΄ΠΎΠ±ΡŠΡ€ ΠΈΠ·Π±ΠΎΡ€ Π·Π° прости Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ минимизация. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°, откритията Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΎΡ‚Π½Π΅ΠΌΠ°Ρ‚ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π²Ρ€Π΅ΠΌΠ΅.

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

Π”Ρ€ΡƒΠ³ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° оптимизация, ΠΏΡ€ΠΈ ΠΊΠΎΠΉΡ‚ΠΎ сС изчисляват само стойности Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠŸΠ°ΡƒΡŠΠ».Π—Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅, трябва Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ 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)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 19
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 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)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 25
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 30
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 30
[1.00000004 1.0000001  1.00000021 1.00000044 1.00000092]

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π½Π° ΡΡŠΠΏΡ€ΡƒΠΆΠ΅Π½ΠΈΡ‚Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ (ΠΡŽΡ‚ΠΎΠ½)

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ ΡΡŠΠΏΡ€ΡƒΠΆΠ΅Π½ΠΈΡ‚Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ Π½Π° ΠΡŽΡ‚ΠΎΠ½ Π΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π° ΠΡŽΡ‚ΠΎΠ½.
ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π½Π° ΠΡŽΡ‚ΠΎΠ½ Π΅ основан Π½Π° аппроксимацията Π½Π° функцията Π² Π»ΠΎΠΊΠ°Π»Π½Π°Ρ‚Π° област с ΠΏΠΎΠ»ΠΈΠ½ΠΎΠΌ ΠΎΡ‚ Π²Ρ‚ΠΎΡ€ΠΈ Ρ€Π΅Π΄:

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

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ SciPy, оптимизация Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ‚Π° Π½Π° Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ (ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π½Π° Π₯СсСн, хСсиан).
Ако Ρ…Π΅ΡΠΈΡΠ½ΡŠΡ‚ Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, локалният ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° Ρ‚Π°Π·ΠΈ функция ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π½Π°ΠΌΠ΅Ρ€Π΅Π½, ΠΊΠ°Ρ‚ΠΎ сС ΠΏΡ€ΠΈΡ€Π°Π²Π½ΠΈ нулСвия Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ° Π½Π° Π½ΡƒΠ»Π°. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Ρ‰Π΅ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΈΠ·Ρ€Π°Π·:

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

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΈΡΡ‚ хСсиян сС изчислява с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π° ΡΡŠΠΏΡ€ΡƒΠΆΠ΅Π½ΠΈΡ‚Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° функцията Π½Π° Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ. Π—Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ ΠΡŽΡ‚ΠΎΠ½-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)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
         Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 24
         ΠžΡ†Π΅Π½ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 33
         ΠžΡ†Π΅Π½ΠΊΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 56
         ΠžΡ†Π΅Π½ΠΊΠΈ гСссиана: 24
[1.         1.         1.         0.99999999 0.99999999]

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ произвСдСния гСссиана ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°

Π’ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡Π°Ρ… вычислСниС ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ всСй ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ГСссС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ памяти. ΠŸΡ€ΠΈ этом фактичСски Π½Π΅Ρ‚ нСобходимости Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ саму ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ ГСссС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€, Ρ€Π°Π²Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ гСссиана с Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅ΠΉ сразу ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ произвСдСния гСссиана с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ.

Рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ hess, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ β€” ΠΊΠ°ΠΊ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ (наряду с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). Π’ нашСм случаС Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ гСссиана Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π ΠΎΠ·Π΅Π½Π±Ρ€ΠΎΠΊΠ° с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТно. Если p β€” ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ SciPy, оптимизация ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄:

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

Ѐункция, Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ гСссиана ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°, пСрСдаСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° hessp Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ 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})

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
         Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 24
         ΠžΡ†Π΅Π½ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 33
         ΠžΡ†Π΅Π½ΠΊΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 56
         ΠžΡ†Π΅Π½ΠΊΠΈ гСссиана: 66

Алгоритм Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области (trust region) сопряТСнных Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² (ΠΡŒΡŽΡ‚ΠΎΠ½Π°)

ΠŸΠ»ΠΎΡ…Π°Ρ ΠΎΠ±ΡƒΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ГСссС ΠΈ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ направлСния поиска ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сопряТСнных Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΡŒΡŽΡ‚ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСэффСктивным. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ отдаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ Π΄ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ области (trust-region) сопряТСнных Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΡŒΡŽΡ‚ΠΎΠ½Π°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ГСссС:

res = minimize(rosen, x0, method='trust-ncg',
               jac=rosen_der, hess=rosen_hess,
               options={'gtol': 1e-8, 'disp': True})
print(res.x)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.
         ВСкущая функция значСния: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 21
         ΠžΡ†Π΅Π½ΠΊΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ гСссиана: 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)

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°.
         ВСкущая функция значСния: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: 21
         ΠžΡ†Π΅Π½ΠΊΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ гСссиана: 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})

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½Π°.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 19
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° гСссиана: 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})

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½Π°.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 19
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 20
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° гСссиана: 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

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡΡ‚Π° бСшС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚Π΅Π½Π°.
         Π’Π΅ΠΊΡƒΡ‰Π° стойност Π½Π° функцията: 0.000000
         Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: 13
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° функцията: 14
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°: 13
         ΠžΡ†Π΅Π½ΠΊΠΈ Π½Π° хСсиана: 14

array([1., 1., 1., 1., 1.])

На Ρ‚ΠΎΠ²Π°, вСроятно, Ρ‰Π΅ сС спрСм. Π’ слСдващата статия Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° Ρ€Π°Π·ΠΊΠ°ΠΆΠ° Π½Π°ΠΉ-интСрСсното Π·Π° условното ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° минимизацията ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Π·Π°Π΄Π°Ρ‡ΠΈ Π·Π° аппроксимация, минимизация Π½Π° функция Π½Π° Π΅Π΄Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΈ ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° ΠΊΠΎΡ€Π΅Π½ΠΈ Π½Π° систСма ΠΎΡ‚ уравнСния с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.optimize.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: https://docs.scipy.org/doc/scipy/reference/

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster