Сципи минимизирует итерацию прошлых границ - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь свести к минимуму функцию 3 входных переменных, используя scipy. Функция выглядит так:

def myfunc(x):
    x[0] = a
    x[1] = b
    x[2] = c
    n = f(a,b,c)
    return n

bound1 = (80,100)
bound2 = (10,20)
bound3 = (312,740)
guess = [a0,b0,c0]
bds = (bound1,bound2,bound3)
result = minimize(myfunc, guess,method='L-BFGS-B',bounds=bds)

Функция, которую я сейчас пытаюсь запустить, достигает минимума при a=100, b=10, c=740, что находится в конце границ.

Функция минимизации продолжает пытаться выполнить итерацию после конца границы 3 (доходит до значения c0 740.0000000149012 на своей последней итерации.

Есть ли способ остановить это? Т.е. остановить итерация в фактическом конце моей границы?

1 Ответ

0 голосов
/ 27 апреля 2020

Это происходит из-за численного дифференцирования , которое само по себе необходимо не только для определения направления шага и размера, но также и для причины завершения .

В общем, вы не можете сделать многое, не будучи очень осторожным в отношении любого используемого решателя (и есть много бэкэнд-решателей). Основная идея c состоит в том, чтобы заменить automati c числовое дифференцирование на предоставленный вами: тогда учитывает эти границы и должен быть внимателен к решающим элементам. Например, «как обосновать прекращение на этом конце».

Исправить A:

Ваша проблема должна vani sh автоматически при использовании: Pull- запрос # 10673 , который касается вашей конфигурации: L-BFGS-B.

Кажется, этот PR не является частью текущего выпуска SciPy 1.4.1 (так как это было 2 месяца до PR).

См. также # 6026 , где упоминается этап 1.5.0 в отношении некоторых изменений, включая относительно границ в num -diff .

Для вышеприведенного PR вам потребуется установить scipy из источников, а именно:

  • вполне выполнимо на linux (и, возможно, OS X)
  • не то, что вы должны попробовать windows!
    • поверь мне ...

При необходимости см. Документацию.

Исправление B:

Кроме этого поскольку вы выполняете безусловную оптимизацию (с переменными границами), где доступно больше решающих бэкэндов (по сравнению с ограниченной оптимизацией), вы можете попробовать другой решатель, trust-constr, который явно поддерживает это, см. # 9098 .

Примите во внимание, что вам необходимо явно указать это при настройке границ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...