SciPy - Optimalkan

Itu scipy.optimize packagemenyediakan beberapa algoritme pengoptimalan yang umum digunakan. Modul ini berisi aspek-aspek berikut -

  • Minimisasi fungsi skalar multivariat yang tidak dibatasi dan dibatasi (minimalkan ()) menggunakan berbagai algoritme (misalnya BFGS, simplex Nelder-Mead, Newton Conjugate Gradient, COBYLA atau SLSQP)

  • Rutinitas pengoptimalan global (brute-force) (misalnya, anneal (), basinhopping ())

  • Algoritme minimisasi kuadrat-terkecil (leastsq ()) dan penyesuaian kurva (curve_fit ())

  • Minimizer fungsi univariat skalar (minimalkan_skalar ()) dan pencari root (newton ())

  • Pemecah sistem persamaan multivariat (root ()) menggunakan berbagai algoritma (misalnya hibrid Powell, Levenberg-Marquardt atau metode skala besar seperti Newton-Krylov)

Minimisasi fungsi skalar multivariasi yang tidak dibatasi & dibatasi

Itu minimize() function menyediakan antarmuka umum ke algoritme minimisasi tanpa batasan dan batasan untuk fungsi skalar multivariasi di scipy.optimize. Untuk mendemonstrasikan fungsi minimisasi, pertimbangkan masalah meminimalkan fungsi Rosenbrock dari variabel NN -

$$ f (x) = \ sum_ {i = 1} ^ {N-1} \: 100 (x_i - x_ {i-1} ^ {2}) $$

Nilai minimum fungsi ini adalah 0, yang dicapai jika xi = 1.

Algoritma Simplex Nelder – Mead

Dalam contoh berikut, rutin meminimalkan () digunakan dengan Nelder-Mead simplex algorithm (method = 'Nelder-Mead')(dipilih melalui parameter metode). Mari kita perhatikan contoh berikut.

import numpy as np
from scipy.optimize import minimize

def rosen(x):

x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method='nelder-mead')

print(res.x)

Program di atas akan menghasilkan keluaran sebagai berikut.

[7.93700741e+54  -5.41692163e+53  6.28769150e+53  1.38050484e+55  -4.14751333e+54]

Algoritme simpleks mungkin adalah cara paling sederhana untuk meminimalkan fungsi yang berperilaku cukup baik. Ini hanya membutuhkan evaluasi fungsi dan merupakan pilihan yang baik untuk masalah minimisasi sederhana. Namun, karena tidak menggunakan evaluasi gradien apa pun, mungkin perlu waktu lebih lama untuk menemukan nilai minimum.

Algoritme pengoptimalan lain yang hanya membutuhkan pemanggilan fungsi untuk menemukan minimum adalah Powell‘s method, yang tersedia dengan menyetel method = 'powell' dalam fungsi minimalkan ().

Kotak Terkecil

Selesaikan masalah kuadrat-terkecil nonlinier dengan batas pada variabel. Mengingat residual f (x) (fungsi riil berdimensi-m dari n variabel riil) dan fungsi kerugian rho (s) (fungsi skalar), kuadrat_kurang menemukan minimum lokal dari fungsi biaya F (x). Mari kita perhatikan contoh berikut.

Dalam contoh ini, kami menemukan fungsi Rosenbrock minimum tanpa batasan pada variabel independen.

#Rosenbrock Function
def fun_rosenbrock(x):
   return np.array([10 * (x[1] - x[0]**2), (1 - x[0])])
   
from scipy.optimize import least_squares
input = np.array([2, 2])
res = least_squares(fun_rosenbrock, input)

print res

Perhatikan bahwa, kami hanya menyediakan vektor dari residu. Algoritme membangun fungsi biaya sebagai jumlah kuadrat dari residual, yang menghasilkan fungsi Rosenbrock. Minimum persisnya adalah pada x = [1.0,1.0].

Program di atas akan menghasilkan keluaran sebagai berikut.

active_mask: array([ 0., 0.])
      cost: 9.8669242910846867e-30
      fun: array([ 4.44089210e-15, 1.11022302e-16])
      grad: array([ -8.89288649e-14, 4.44089210e-14])
      jac: array([[-20.00000015,10.],[ -1.,0.]])
   message: '`gtol` termination condition is satisfied.'
      nfev: 3
      njev: 3
   optimality: 8.8928864934219529e-14
      status: 1
      success: True
         x: array([ 1., 1.])

Penemuan root

Mari kita pahami bagaimana pencarian root membantu dalam SciPy.

Fungsi skalar

Jika seseorang memiliki persamaan variabel tunggal, ada empat algoritma pencarian akar yang berbeda, yang dapat dicoba. Masing-masing algoritme ini memerlukan titik akhir interval di mana akar diharapkan (karena fungsi mengubah tanda). Secara umum,brentq adalah pilihan terbaik, tetapi metode lain mungkin berguna dalam keadaan tertentu atau untuk tujuan akademis.

Pemecahan titik tetap

Masalah yang terkait erat dengan mencari nol suatu fungsi adalah masalah menemukan titik tetap dari suatu fungsi. Titik tetap dari suatu fungsi adalah titik di mana evaluasi fungsi mengembalikan titik: g (x) = x. Jelas titik tetap dariggadalah akar dari f (x) = g (x) −x. Sama halnya, root dariffadalah titik_ketentuan dari g (x) = f (x) + x. Fixed_point rutin menyediakan metode iteratif sederhana menggunakanAitkens sequence acceleration untuk memperkirakan titik tetap gg, jika titik awal diberikan.

Kumpulan persamaan

Menemukan akar dari himpunan persamaan non-linier dapat dilakukan dengan menggunakan root() function. Beberapa metode tersedia, di antaranyahybr (default) dan lm, masing-masing menggunakan hybrid method of Powell dan Levenberg-Marquardt method dari MINPACK.

Contoh berikut mempertimbangkan persamaan transendental variabel tunggal.

x2 + 2cos(x) = 0

Akar yang dapat ditemukan sebagai berikut -

import numpy as np
from scipy.optimize import root
def func(x):
   return x*2 + 2 * np.cos(x)
sol = root(func, 0.3)
print sol

Program di atas akan menghasilkan keluaran sebagai berikut.

fjac: array([[-1.]])
fun: array([ 2.22044605e-16])
message: 'The solution converged.'
   nfev: 10
   qtf: array([ -2.77644574e-12])
      r: array([-3.34722409])
   status: 1
   success: True
      x: array([-0.73908513])