Модуль 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
- Минимизация нескольких переменных
- Метод Bounds()
- Метод scipy.optimize.minimize()
- Метод Minimin_scalar()
- Метод Пауэлла
- Почему не работает
- Метод Trust-Exact
Минимизация нескольких переменных
Здесь, в этом разделе, мы вручную создадим метод, который будет принимать несколько параметров или переменных, чтобы найти минимальное значение функции, используя метод 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)
Метод 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() 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.