• Автор записи:
  • Рубрика записи:Scipy
  • Время чтения:5 минут чтения
  • Комментарии к записи:0 комментариев

Модуль Python Scipy scipy.optimize имеет метод Minimize(), который принимает скалярную функцию одной или нескольких минимизируемых переменных.

Синтаксис:

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

Где параметры:

  • fun (callable): минимизация — это целевая функция.
  • x0 (shape(n), ndarray): первая интуиция. массив реальных объектов, где n — общее количество независимых переменных, а размер массива равен(n,).
  • method (str или вызываемый): тип решателя должен быть одним из следующих: Trust-Krylov, Nelder-Mead, CG, Powell, BFGS, L-BFGS-B, TNC, COBYLA, Trust-Exact, Newton-CG, SLSQP, Dogleg, доверие-ncg, доверие-constr.
  • args (tuple): дополнительные аргументы, передаваемые производным целевой функции.
  • jac (bool, cs, 2 или 3 точки): подход к вычислению вектора градиента. только для BFGS, CG, L-BFGS-B, Newton-CG, TNC, Dogleg, SLSQP, Trust-NCG, Trust-Exact, Trust-Krylov и Trust-Constr. Если это вызываемая функция, это должна быть функция, которая возвращает вектор градиента: «jac(x, *args) -> array_like, shape(n,)». Где x — массив формы(n,), а args — кортеж фиксированных параметров. Считается, что целевая функция и градиент возвращаются функцией fun, если jac имеет логическое значение и имеет значение True.
  • hessp (callable): гессиан целевой функции, умноженный на p, случайный вектор. Конкретно для Newton-CG, Trust-NCG, Trust-Krylov и Trust-Constr. Hessp или Hess следует давать только один раз. Hessp не будет учитываться, если указан hess. Гессиан необходимо умножить на любой вектор с помощью hessp: «hessp(x, p, *args) -> ndarray shape(n,)». Где args — кортеж, содержащий фиксированные параметры, p — произвольный вектор размерности(n), а x —(n,) ndarray.
  • hess: метод вычисления матрицы Гессе. только для алгоритмов Dogleg, Newton-CG, Trust-NCG, Trust-Exact, Trust-Krylov и Trust-Constr. Это должно вывести матрицу Гессе, если она доступна для вызова: «ess(x, *args) -> {LinearOperator, spmatrix, array},(n, n)». Где args — это кортеж фиксированных параметров, а x — массив размера(n, n). Чтобы выбрать схему конечных разностей для численной оценки гессиана, также можно использовать ключевые слова «2-точка», «3-точка» и «cs».
  • constraints (dict,constraint): ограничивает определение. только в отношении SLSQP, COBYLA и Trust-Constr. Отдельный объект или набор объектов, задающих ограничения для задачи оптимизации, называются ограничениями «конструкции доверия». Доступные ограничения: Нелинейные или Линейные ограничения.
  • tol (float): допуск на завершение. Когда tol предоставляется, выбранный алгоритм минимизации уравнивает все соответствующие допуски, специфичные для решателя, с tol. Используйте настройки, специфичные для решателя, для более детального управления.
  • bounds (границы или последовательность): для методов L-BFGS-B, Nelder-Mead, TNC, Powell, SLSQP и Trust-Constr — границы переменных. Границы можно указать одним из двух способов: экземпляр класса Bounds, и для каждого элемента в x задается список пар(мин, максимум). Чтобы указать отсутствие границ, используйте слово none.
  • callback(): вызывается после каждой итерации. Его можно вызвать с помощью подписи «trust-constr».
  • options(dict): список возможных решателей.

Метод Minimize() возвращает res (Объект OptimizeResult используется для представления результата оптимизации. Массив решения x, успех, логическое указание, указывающее, успешно ли завершился оптимизатор, и сообщение, объясняющее причину завершения, являются важными функциями).

Давайте рассмотрим пример, выполнив следующий шаг:

  • Импортируйте необходимый метод или библиотеки, используя приведенный ниже код Python.
from scipy import optimize
  • Простой способ использовать подход Нелдера-Мида — использовать приведенный ниже код.
data_x0 = [2.1, 0.5, 0.9, 1.7, 1.1]
result = optimize.minimize(optimize.rosen, data_x0, method='Nelder-Mead', tol=1e-5)
result.x

метод Minimin()

Содержание

Минимизация нескольких переменных

Здесь, в этом разделе, мы вручную создадим метод, который будет принимать несколько параметров или переменных, чтобы найти минимальное значение функции, используя метод Minimize() модуля scipy.optimize.

Выполните следующие шаги, чтобы создать метод:

  • Импортируйте необходимые библиотеки, используя приведенный ниже код Python.
from scipy import optimize
  • Определите метод, используя приведенный ниже код.
def fun(paramt):
    # print(paramt)  # <-- As you can see, params is an array in NumPy.
    x, y, z = paramt # <-- You might want to give the component variables names to make them easier to read.
    return x**2 + y**3 + z**3
  • Определите первоначальное предположение и передайте его или функцию методу Minimize(), используя приведенный ниже код.
first_guess = [0.5, 0.5, 0.5]
res = optimize.minimize(fun, first_guess)
  • Проверьте результат или значения нескольких переменных, которые мы определили в функции, используя приведенный ниже код.
res.x

Минимальное значение для нескольких переменных

Метод Bounds()

Модуль Python Scipy scipy.optimize содержит метод Bounds(), который определяет ограничения границ для переменных.

Ограничения принимают форму общего неравенства: lb <= x <= ub

Синтаксис:

scipy.optimize.Bounds(lb, ub, keep_feasible=False)

Где параметры:

  • ub, lb (array_data): нижняя и верхняя границы независимой переменной. Каждый массив должен иметь тот же размер, что и x, или он должен быть скаляром, и в этом случае граница будет одинаково применяться ко всем переменным. Чтобы исправить переменную, уравняйте части lb и ub. Чтобы удалить границы всех или некоторых переменных, используйте np.inf вместе с соответствующим знаком. Помните, что вы можете смешивать ограничения разных типов, например, интервальные, односторонние или равенства, корректируя при необходимости различные компоненты lb и ub.
  • Keep_feasible (boolean): продолжать ли делать элементы ограничения работоспособными после итераций. Это свойство было установлено для всех компонентов с одним значением. Значение по умолчанию — «Ложь». не влияет на ограничения равенства.

Давайте рассмотрим пример, выполнив следующие шаги:

  • Импортируйте необходимый метод и определите границу, используя приведенный ниже код Python.
from scipy.optimize import Bounds
  • Определите границы, используя приведенный ниже код.
Bounds(2,7)

Метод Bounds()

Метод scipy.optimize.minimize()

Определите ограничения, используя приведенный ниже код Python.

s[0] + s[1] = 1

Создание функции, которая должна равняться нулю, будет ограничением равенства (type=’eq’) с использованием приведенного ниже кода.

def cont(s):
    return s[0] + s[1] - 1

Затем мы создаем диктовку вашего ограничения(или, если их несколько, список диктовок), используя приведенный ниже код.

constarnt = {'type':'eq', 'fun': cont}
const_real(t):
    return np.sum(np.iscomplex(s))

И обязательно укажите оба ограничения, используя приведенный ниже код.

constarnt = [{'type':'eq', 'fun': const},
        {'type':'eq', 'fun': const_real}]

Затем мы вводим ограничения в метод минимизации, как показано в приведенном ниже коде.

scipy.optimize.minimize(function, data_x0, constraints=constarnt)

Метод Minimin_scalar()

Модуль Python Scipy scipy.optimize.minimize содержит метод Minimin_scalar(), который принимает скалярную функцию одной переменной, которую необходимо минимизировать.

Если ваша функция является скалярной функцией с одной переменной, вы можете использовать функцию Minimin_scalar(), чтобы получить минимальное значение функции и значение, которое ее минимизирует.

Синтаксис:

scipy.optimize.minimize_scalar(fun, bounds=None, args=(), bracket=None, method='brent', options=None, tol=None)

Где параметры:

  • fun (callable): целевая функция. Скаляр должен быть возвращен скалярной функцией.
  • границы(последовательность): границы являются обязательным параметром для метода «ограниченный» и должны содержать два элемента, составляющие границы оптимизации.
  • args (tuple): дополнительные входные данные, передаваемые целевой функции.
  • bracket (последовательность): для методов «золотой» и «брент» интервал брекетинга определяется скобкой, которая может содержать три элемента(a, b и c), так что abc и fun(b) fun(a ), fun(c) или два элемента(a и c), которые считаются стартовым интервалом для поиска нисходящей скобки. Не всегда гарантировано, что решение будет удовлетворять условию a == x = c.
  • method: тип решателя. должен быть один из Golden, Bounded и Brent.
  • options (dict): список возможных решателей.
  • tol (float): допуск на завершение. Используйте настройки, специфичные для решателя, для более детального управления.

Метод Minimize() возвращает res (объект OptimizeResult используется для представления результата оптимизации).

Давайте разберемся на примере, выполнив следующие шаги:

  • Импортируйте необходимый метод или библиотеки, используя приведенный ниже код Python.
from scipy import optimize
  • Создайте функцию, которую мы собираемся минимизировать, используя приведенный ниже код.
def fun(s):
    return(s - 3) * s *(s + 3)**3
  • Передайте вышеуказанную функцию методу Minimin_scalar(), чтобы найти минимальное значение, используя приведенный ниже код.
result = optimize.minimize_scalar(fun)
result.x

Метод Minimin_scalar()

Метод Пауэлла

Метод Minimin() Python Scipy, который мы узнали выше, принимает метод Пауэлла, который использует модифицированную версию метода Пауэлла для минимизации скалярной функции одной или нескольких переменных.

Синтаксис:

scipy.optimize.minimize(fun, x0,method='Powell', bounds=None, 'xtol': 0.0002, 'ftol': 0.0002, 'maxiter': None, 'maxfev': None, 'disp': False, 'direc': None, 'return_all': False})

Где параметры:

  • disp (boolean): чтобы печатать сообщения о конвергенции, установите значение True.
  • xtol (float): Допустимая относительная ошибка в решении xopt для сходимости.
  • ftol (float): относительная ошибка fun(xopt) приемлема для сходимости.
  • maxiter, maxfev (int): Максимальное разрешенное количество оценок функции и итераций. Если ни maxiter, ни maxfev не установлены, значение по умолчанию — N*1000, где N — количество переменных. Процесс минимизации завершится при достижении первого значения, если установлены и maxiter, и maxfev.
  • direc (ndarray): Начальный набор векторов направления метода Пауэлла.
  • return_all (boolean): если выбрано значение True, лучшие решения для каждой итерации будут возвращены в виде списка.

Почему не работает

Если мы обнаружим, что метод Minimize() не работает, это означает, что любые предоставленные входные данные или параметры и т. д. не предоставляются так, как должны. Иногда мы предоставляем вектора вместо скаляров методу или недопустимые параметры и функции.

Ошибка такого рода генерирует ошибку или сообщает, что минимизация не работает. Чтобы избежать ошибки, следуйте соответствующей документации о методе Minimize(), как использовать этот метод и какие допустимые значения или параметры он принимает.

Метод Trust-Exact

Метод Trust-Exact совместим с функцией Python Scipy Minimin(), о которой мы узнали в предыдущем разделе. Использование метода, точного по доверию, с функцией Minimin(), которая практически точно минимизирует скалярную функцию одной или нескольких переменных.

Синтаксис:

scipy.optimize.minimize(fun, x0, args=(), method='trust-exact', jac=None, hess=None, tol=None, callback=None, options={})

Где параметры:

  • intial_tr_radius (float): начальный радиус доверительной области.
  • max_tr_radius (float): радиус доверительной области при максимальном значении. При превышении этого значения дополнительные действия предлагаться не будут.
  • eta (float): критерии приемлемости предлагаемых шагов, которые зависят от регионов доверия.
  • gtol (float): прежде чем завершение будет успешным, норма градиента должна быть ниже gtol.
Добавить комментарий