SciPy Optimizers

بهینه کننده‌ها در SciPy

بهینه کننده‌ها یک مجموعه فرایند تعریف شده در SciPy هستند که یا مقدار کمینه تابع و یا ریشه یک معادله را پیدا می‌کنند.

ذاتاً تمامی الگوریتم‌های یادگیری ماشین چیزی به غیر از یک معادله پیچیده که بوسیله داده‌های داده شده باید کمینه شوند نیست.

ریشه یک معادله

NumPy قادر است که ریشه معادلات چند جمله‌ای و معادلات خطی را پیدا کند. اما نمی‌تواند ریشه معادلات غیرخطی مانند معادله زیر را پیدا کند.

x + cos(x)

برای پیدا کردن ریشه معادلاتی نظیر معادله بالا، می‌توانید از تابع optimize.root() استفاده کنید.

این تابع نیاز به دو پارامتر ورودی دارد:

  • fun - یک تابع که معرف معادله باشد.
  • x0 - یک حدس اولیه برای ریشه.

تابع optimize.root() شیءای را برمی‌گرداند که شامل اطلاعاتی درباره جواب مسئله است.

جوابی که ما به دنبالش هستیم تحت ویژگی x از شیء برگردانده شده قرار دارد.


from scipy.optimize import root
from math import cos

def eqn(x):
  return x + cos(x)

myroot = root(eqn, 0)

print(myroot.x)

خروجی:

شیء برگردانده شده اطلاعات بسیار بیشتری در خود دارد که می‌توانید آن را به صورت زیر مشاهده کنید.


from scipy.optimize import root
from math import cos

def eqn(x):
    return x + cos(x)

myroot = root(eqn, 0)

print(myroot)

خروجی:

کمینه کردن یک تابع

در اینجا منظور از تابع، تابعی است که معرف یک منحنی باشد. چنانکه می‌دانید منحنی دارای نقاط اوج و حضیض است.

به نقاط اوج ماکزیمم یا بیشینه تابع می‌گوئیم و به نقاط حضیض مینیمم یا کمینه تابع می‌گوئیم.

بلندترین نقطه در کل منحنی را ماکزیمم سراسری (globl maxima) و سایر نقاط بلند را ماکزیمم محلی (local maxima) می‌گوئیم.

همچنین پایین‌ترین نقطه در کل منحنی را مینیمم سراسری (globl minima) و سایر نقاط پایین را مینیمم محلی (local minima) می‌گوئیم.

پیدا کردن کمینه

برای کمینه کردن یک تابع می‌توانیم از تابع scipy.optimize.minimize() استفاده کنیم.

تابع minimize() به پارامترهای زیر به عنوان ورودی نیاز دارد:

  • fun - یک تابع که معرف معادله باشد.
  • x0 - یک حدس اولیه برای ریشه.

همچنین دارای یک سری ورودی‌های اختیاری نظیر:

  • method - اسم روش مورد استفاده که مقادیر مجاز برای آن عبارتند از:
    • 'CG'
    • 'BFGS'
    • 'Newton-CG'
    • 'L-BFGS-B'
    • 'TNC'
    • 'COBYLA'
    • 'SLSQP'
    • 'Nelder-Mead'
    • 'Powell'
    • 'trust-constr'
    • 'dogleg'
    • 'trust-ncg'
    • 'trust-exact'
    • 'trust-krylov'

و

  • option است. این پارامتر به صورت یک دیکشنری است که پارامترهای بیشتری را تعریف می‌کند.
{
   "disp": boolean - print detailed description,
   "gtol": number - the tolerance of the error
}

شکل کامل این تابع به صورت زیر است:

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)

در کد زیر تابع x^2 + x + 2 را با استفاده از الگوریتم Broyden–Fletcher–Goldfarb–Shanno یا همان روش BFGS کمینه می‌کنیم.

همانطور که می‌دانیم این تابع معرف یک سهمی است که کمینه آن در -0.5 رخ می‌دهد.


from scipy.optimize import minimize

def eqn(x):
  return x**2 + x + 2

mymin = minimize(eqn, 0, method='BFGS')

print(mymin)

خروجی:

جهت به دست‌آوردن اطلاعات بیشتر در مورد این تابع می‌توانید به وب‌سایت رسمی آن به آدرس https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html مراجعه کنید.