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

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

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»Π°ΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.
         ВСкущая функция: 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