scipy.optimize.

brute#

scipy.optimize.brute(функция, диапазоны, args=(), Ns=20, full_output=0, finish= fmin>, disp=False, workers=1)[источник]#

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

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

Функция вычисляется во всем диапазоне с типом данных первого вызова функции, как обеспечивается vectorize Функция NumPy. Значение и тип оценки функции, возвращаемые, когда full_output=True дополнительно подвержены влиянию finish аргумент (см. Примечания).

Подход грубой силы неэффективен, потому что количество точек сетки увеличивается экспоненциально — количество точек сетки для вычисления равно Ns ** len(x). Следовательно, даже при грубом шаге сетки, даже умеренно большие задачи могут выполняться долго и/или упираться в ограничения памяти.

Параметры:
функцияcallable

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

диапазоныкортеж

Каждый компонент диапазоны кортеж должен быть либо "объектом среза", либо кортежем диапазона вида (low, high). Программа использует их для создания сетки точек, на которой будет вычисляться целевая функция. См. Примечание 2 для более подробной информации.

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

Любые дополнительные фиксированные параметры, необходимые для полного определения функции.

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

Количество точек сетки вдоль осей, если не указано иначе. См. Примечание 2.

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

Если True, возвращает сетку оценки и значения целевой функции на ней.

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

Функция оптимизации, которая вызывается с результатом грубого поиска минимума в качестве начального приближения. finish должен принимать функция и начальное приближение в качестве позиционных аргументов, и принимать args как именованные аргументы. Также может принимать full_output и/или disp в качестве ключевых аргументов. Используйте None, если функция "полировки" не должна использоваться. Подробнее см. в примечаниях.

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

Установите True для вывода сообщений о сходимости из finish вызываемый объект.

workersint или вызываемый объект, подобный отображению, необязательный

Если workers если это целое число, сетка подразделяется на workers разделы и вычисляются параллельно (использует multiprocessing.Pool). Укажите -1 использовать все доступные ядра для процесса. В качестве альтернативы предоставьте вызываемый объект, подобный map, такой как multiprocessing.Pool.map для параллельной оценки сетки. Эта оценка выполняется как workers(func, iterable). Требует, чтобы функция быть сериализуемым через pickle.

Добавлено в версии 1.3.0.

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

Одномерный массив, содержащий координаты точки, в которой целевая функция имеет минимальное значение. (См. Примечание 1 для которой возвращается точка.)

fvalfloat

Значение функции в точке x0. (Возвращается, когда full_output равно True.)

сеткакортеж

Представление сетки вычислений. Имеет ту же длину, что и x0. (Возвращается, когда full_output равно True.)

Joutndarray

Значения функции в каждой точке сетки оценки, т.е., Jout = func(*grid). (Возвращается, когда full_output равно True.)

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

basinhopping, differential_evolution

Примечания

Примечание 1: Программа находит точку сетки, в которой возникает наименьшее значение целевой функции. Если finish равно None, это возвращаемая точка. Когда глобальный минимум находится внутри (или не слишком далеко за пределами) границ сетки, и сетка достаточно мелкая, эта точка будет в окрестности глобального минимума.

Однако пользователи часто используют другие программы оптимизации для «полировки» значений сетки, т.е. для поиска более точного (локального) минимума вблизи brute’s лучшая точка сетки. brute функции finish опция предоставляет удобный способ сделать это. Любая используемая программа полировки должна учитывать brute’s вывод в качестве начального приближения в качестве позиционного аргумента и принимает brute’s входные значения для args в качестве аргументов ключевых слов, иначе будет вызвана ошибка. Может также принимать full_output и/или disp ), а не просто

brute предполагает, что finish функция возвращает либо OptimizeResult объект или кортеж в форме: (xmin, Jmin, ... , statuscode), где xmin является минимизирующим значением аргумента, Jmin является минимальным значением целевой функции, "…" могут быть некоторые другие возвращаемые значения (которые не используются в brute), и statuscode это код состояния finish программа.

Обратите внимание, что когда finish не равно None, возвращаемые значения являются значениями finish программа, не точек сетки. Следовательно, в то время как brute ограничивает поиск входными точками сетки, finish результаты программы обычно не будут совпадать ни с одной точкой сетки и могут выходить за границы сетки. Таким образом, если минимум нужно найти только среди предоставленных точек сетки, убедитесь, что передаётся finish=None.

Примечание 2: Сетка точек — это numpy.mgrid объект. Для brute the диапазоны и Ns входные данные имеют следующий эффект. Каждый компонент диапазоны кортеж может быть либо объектом среза, либо двухэлементным кортежем, задающим диапазон значений, например (0, 5). Если компонент является объектом среза, brute использует его напрямую. Если компонент является диапазоном из двух кортежей, brute внутренне преобразует его в объект среза, который интерполирует Ns точки от минимального до максимального значения включительно.

Примеры

Мы иллюстрируем использование brute для поиска глобального минимума функции двух переменных, заданной как сумма положительно-определённой квадратичной формы и двух глубоких «гауссовых» кратеров. Конкретно, определим целевую функцию f как сумма трёх других функций, f = f1 + f2 + f3. Мы предполагаем, что каждый из них имеет сигнатуру (z, *params), где z = (x, y), и params и функции определены ниже.

>>> import numpy as np
>>> params = (2, 3, 7, 8, 9, 10, 44, -1, 2, 26, 1, -2, 0.5)
>>> def f1(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (a * x**2 + b * x * y + c * y**2 + d*x + e*y + f)
>>> def f2(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-g*np.exp(-((x-h)**2 + (y-i)**2) / scale))
>>> def f3(z, *params):
...     x, y = z
...     a, b, c, d, e, f, g, h, i, j, k, l, scale = params
...     return (-j*np.exp(-((x-k)**2 + (y-l)**2) / scale))
>>> def f(z, *params):
...     return f1(z, *params) + f2(z, *params) + f3(z, *params)

Таким образом, целевая функция может иметь локальные минимумы вблизи минимума каждой из трех функций, из которых она состоит. Чтобы использовать fmin чтобы улучшить результат сеточной точки, мы можем затем продолжить следующим образом:

>>> rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25))
>>> from scipy import optimize
>>> resbrute = optimize.brute(f, rranges, args=params, full_output=True,
...                           finish=optimize.fmin)
>>> resbrute[0]  # global minimum
array([-1.05665192,  1.80834843])
>>> resbrute[1]  # function value at global minimum
-3.4085818767

Обратите внимание, что если finish было установлено в None, мы бы получили точку сетки [-1.0 1.75], где округленное значение функции равно -2.892.