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.)
Смотрите также
Примечания
Примечание 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объект. Дляbrutethe диапазоны и 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.