scipy.optimize.

fmin_cg#

scipy.optimize.fmin_cg(f, x0, fprime=None, args=(), gtol=1e-05, norm=inf, эпсилон=np.float64(1.4901161193847656e-08), maxiter=None, full_output=0, disp=1, retall=0, callback=None, c1=0.0001, c2=0.4)[источник]#

Минимизировать функцию с использованием алгоритма нелинейного сопряжённого градиента.

Параметры:
fвызываемый, f(x, *args)

Целевая функция для минимизации. Здесь x должен быть одномерным массивом переменных, которые будут изменяться при поиске минимума, и args являются другими (фиксированными) параметрами f.

x0ndarray

Пользовательская начальная оценка xopt, оптимальное значение x. Это должен быть одномерный массив значений.

fprimeвызываемый, fprime(x, *args), опционально

Функция, возвращающая градиент f в x. Здесь x и args описаны выше для f. Возвращаемое значение должно быть одномерным массивом. По умолчанию None, в этом случае градиент аппроксимируется численно (см. эпсилон, ниже).

argsкортеж, необязательный

Значения параметров, передаваемые в f и fprime. Должен быть указан всякий раз, когда требуются дополнительные фиксированные параметры для полного определения функций f и fprime.

gtolfloat, опционально

Остановка, когда норма градиента меньше чем gtol.

normfloat, опционально

Порядок для нормы градиента (-np.inf является минимумом, np.inf является максимальным).

эпсилонfloat или ndarray, опционально

Шаг(и) для использования при fprime аппроксимируется численно. Может быть скаляром или одномерным массивом. По умолчанию sqrt(eps), где eps - машинная точность с плавающей запятой. Обычно sqrt(eps) составляет около 1.5e-8.

maxiterint, необязательный

Максимальное количество итераций для выполнения. По умолчанию 200 * len(x0).

full_outputbool, необязательно

Если True, возвращает fopt, func_calls, grad_calls, и warnflag в дополнение к xopt. См. раздел Returns ниже для дополнительной информации о необязательных возвращаемых значениях.

dispbool, необязательно

Если True, возвращает сообщение о сходимости, за которым следует xopt.

retallbool, необязательно

Если True, добавляет к возвращаемым значениям результаты каждой итерации.

callbackвызываемый объект, необязательный

Необязательная пользовательская функция, вызываемая после каждой итерации. Вызывается как callback(xk), где xk является текущим значением x0.

c1float, по умолчанию: 1e-4

Параметр для правила условия Армихо.

c2float, по умолчанию: 0.4

Параметр для правила условия кривизны.

Возвращает:
xoptndarray

Параметры, минимизирующие f, т.е., f(xopt) == fopt.

foptfloat, опционально

Найденное минимальное значение, f(xopt). Возвращается только если full_output равно True.

func_callsint, необязательный

Количество вызовов функции. Возвращается только если full_output равно True.

grad_callsint, необязательный

Количество вызовов градиента. Возвращается только если full_output равно True.

warnflagint, необязательный

Целочисленное значение со статусом предупреждения, возвращается только если full_output равно True.

0 : Успех.

1 : Превышено максимальное количество итераций.

2Градиент и/или вызовы функций не изменялись. Может указывать

что точность была потеряна, т.е. процедура не сошлась.

3 : встречен результат NaN.

allvecsсписок ndarray, опционально

Список массивов, содержащих результаты на каждой итерации. Возвращается только если retall равно True.

Смотрите также

minimize

общий интерфейс ко всем scipy.optimize алгоритмы для безусловной и условной минимизации многомерных функций. Он предоставляет альтернативный способ вызова fmin_cg, указав method='CG'.

Примечания

Этот алгоритм сопряжённых градиентов основан на алгоритме Поляка и Рибьера [1].

Методы сопряженных градиентов обычно работают лучше, когда:

  1. f имеет единственную глобальную точку минимума и не имеет локальных минимумов или других стационарных точек,

  2. f является, по крайней мере локально, достаточно хорошо аппроксимируемой квадратичной функцией переменных,

  3. f является непрерывной и имеет непрерывный градиент,

  4. fprime не слишком велика, например, имеет норму менее 1000,

  5. Начальное приближение, x0, достаточно близко к f глобальная точка минимума xopt.

Параметры c1 и c2 должно удовлетворять 0 < c1 < c2 < 1.

Ссылки

[1]

Райт и Ноцедал, «Численная оптимизация», 1999, стр. 120-122.

Примеры

Пример 1: поиск минимального значения выражения a*u**2 + b*u*v + c*v**2 + d*u + e*v + f для заданных значений параметров и начального приближения (u, v) = (0, 0).

>>> import numpy as np
>>> args = (2, 3, 7, 8, 9, 10)  # parameter values
>>> def f(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     return a*u**2 + b*u*v + c*v**2 + d*u + e*v + f
>>> def gradf(x, *args):
...     u, v = x
...     a, b, c, d, e, f = args
...     gu = 2*a*u + b*v + d     # u-component of the gradient
...     gv = b*u + 2*c*v + e     # v-component of the gradient
...     return np.asarray((gu, gv))
>>> x0 = np.asarray((0, 0))  # Initial guess.
>>> from scipy import optimize
>>> res1 = optimize.fmin_cg(f, x0, fprime=gradf, args=args)
Optimization terminated successfully.
         Current function value: 1.617021
         Iterations: 4
         Function evaluations: 8
         Gradient evaluations: 8
>>> res1
array([-1.80851064, -0.25531915])

Пример 2: решить ту же задачу с использованием minimize функция. (Это myopts словарь показывает все доступные опции, хотя на практике потребуются только нестандартные значения. Возвращаемое значение будет словарём.)

>>> opts = {'maxiter' : None,    # default value.
...         'disp' : True,    # non-default value.
...         'gtol' : 1e-5,    # default value.
...         'norm' : np.inf,  # default value.
...         'eps' : 1.4901161193847656e-08}  # default value.
>>> res2 = optimize.minimize(f, x0, jac=gradf, args=args,
...                          method='CG', options=opts)
Optimization terminated successfully.
        Current function value: 1.617021
        Iterations: 4
        Function evaluations: 8
        Gradient evaluations: 8
>>> res2.x  # minimum found
array([-1.80851064, -0.25531915])