2016-07-29 7 views
2

Я бегу задачи оптимизации с около 1500 переменных и принимает более 30 минут, чтобы бежать ....Scipy.optimize минимизируют слишком долго

Если я уменьшить допуск к 1 Минимизация завершат примерно через пять минут, но это не похоже на хороший способ ускорить процесс.

from scipy.optimize import minimize 

results = minimize(objFun, initialVals, method='SLSQP', bounds = bnds, constraints=cons, tol = toler) 

print(results) 

fun: -868.72033130318198 
jac: array([ 0., 0., 0., ..., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
nfev: 1459 
nit: 1 
njev: 1 
status: 0 
success: True 
x: array([ 0., 0., 0., ..., 1., 1., 1.]) 

Любые предложения будут оценены.

+0

Вы пытались увеличить размер шагового размера/разностную производную epsilon? Иногда не будет/мало прогресса, если он слишком мал, но это зависит от проблемы (гладкость - большой фактор). Также вы можете попробовать другие оптимизаторы. – sascha

+0

Нужна только одна итерация? Вы должны быть счастливы. Похоже, вы не предоставляли градиенты, поэтому решатель делал конечные различия. Ваши функции кажутся дорогими для оценки, а отсутствие доступных градиентов делает эту проблему не очень подходящей для этого решателя. Возможно, вам придется посмотреть на производный бесплатный решатель. –

+0

Существуют ли другие ограниченные библиотеки оптимизации для Python, которые работают с нелинейными уравнениями? Я их не видел. –

ответ

2

Вот что я хотел бы сделать:

  • профиль минимизации. Из вашего вывода кажется, что оценка функции является узким местом. Проверьте, так ли это. Если да, то:
  • Посмотрите, можете ли вы вычислить якобиан с помощью бумаги и карандаша или системы CAS. Используйте его вместо конечных разностей.
  • посмотреть, если вы можете ускорить саму функцию (математические упрощений, NumPy векторизации, Cython)
4

Ваша терпимость должна быть установлена ​​на любой допуск вам нужно. Установка его выше просто говорит оптимизатору остановиться раньше и на самом деле не ускоряет его. Это, как говорится, позволяя ему пойти на большую опору, может быть пустой тратой вашего времени, если не нужно.

Возможные способы сократить время, требуемое следующим образом:

  • Используйте другой Оптимизатор
  • Используйте другой градиент найти метод
  • Ускорить ваша целевая функция
  • Снизить количество дизайна переменные
  • Выберите лучшее начальное предположение
  • Использовать параллельную обработку

Градиентных методам

Как вы используете конечные разности, вам нужна (1 + числа проектных переменные) оценка вашей целевой функции, чтобы получить общую чувствительность.

Как сказал ev-br, если вы можете найти аналитическое решение для jacobian, тогда это не нужно. Исходя из того факта, что у вас есть 1500 переменных дизайна. Я предполагаю, что это не легко, хотя, если ваша целевая функция позволяет, автоматическая дифференциация может быть вариантом. У Iv был некоторый опыт работы с AlgoPy, на который вы могли бы посмотреть.

Цель скорости Функция

Из-за большого числа оценок целевой функции, это может быть простой подход. Еще раз, см. Ответ ev-br для таких вещей, как компиляция с использованием cython, и общая сокращающая сложность. Вы можете попробовать запустить часть кода, используя timeit, чтобы посмотреть, выгодны ли изменения.

Design переменные

Уменьшение числа переменных проектирования линейно снижает объективные вызовы функций, необходимых для конечных разностей. Значительно ли изменились ваши переменные?Может ли быть зафиксировано определенное значение? Можете ли вы получить какую-то функцию других?

Начальная Guess

В зависимости от вашей проблемы, вы можете быть в состоянии выбрать лучшую отправную точку, что будет означать ваше Оптимизатор «ближе» к окончательному решению. В зависимости от вашей проблемы вы также можете «перезапустить» свою оптимизацию из предыдущего результата.

параллелизме

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

+0

Как я мог бы включить сгенерированные производные AlgoPy в функцию минимизации? Поскольку мои первоначальные мои предположения довольно хороши, вычисление якобиан отдельно кажется лучшим вариантом. Вероятно, я мог бы сократить количество переменных, поэтому я тоже это рассмотрю. –

+0

Thats, вероятно, лучше всего его собственный вопрос, и я havnt использовал его какое-то время, но, как правило, автоматическое дифференцирование фактически не создает символическую/кодированную функцию дифференцирования, а скорее с данными входами дает вам производные с этими входами путем разбора ваша оригинальная функция. Поэтому я думаю, что ваша функция градиента будет оберткой для автоматического кода, использующего целевую функцию. – Wokpak

+0

Хорошо. Я вычислил производные вручную и поместил их в функцию, которая возвращает якобиан в каждой точке ... мы увидим, как это работает. –