Использование scipy.optimize.fmin_slsqp

Я пытаюсь использовать пакет scipy.optimize, чтобы найти максимум моей функции стоимости.

В этом конкретном случае: у меня есть список цен, которые меняются в течение дня. Чтобы это стало проще, давайте предположим, что день имеет 8 часов, а цена в каждый час выглядит следующим образом:

price_list = np.array([1,2,6,8,8,5,2,1]) 

В этом упрощенном случае я хочу выбрать 4 самых высоких цены из этого price_list. И по разным причинам я не хочу просто сортировать и выбирать лучшие четыре цены, но использовать некоторый алгоритм оптимизации. У меня есть несколько ограничений, поэтому я решил использовать алгоритм наименьшего квадрата из scipy, scipy.optimize.fmin_slsqp.

Сначала я создаю расписание для выбранных часов:

 schedule_list = np.zeros( len(price_list), dtype=float) 

Затем мне нужно определить мою обратную функцию profit_function. За все выбранные часы я хочу подвести итоги своей прибыли. Хотя я хочу оптимизировать свое расписание, price_list фиксирован, поэтому мне нужно поместить его в * args:

 def price_func( schedule_list, *price_list ): return -1.*np.sum( np.dot( schedule_list, price_list ) ) 

Как только я понимаю, как все работает в принципе, я буду перемещать кое-что. До тех пор я просто избегаю использовать больше аргументов * args и определяю свое ограничение с помощью жесткого кодированного количества часов для запуска. И я хочу, чтобы мои выбранные часы были ровно 4, поэтому я использую ограничение равенства:

 def eqcon(x, *price_list): return sum( schedule_list ) - 4 

Кроме того, я хочу ограничить мои значения расписания как 0 или 1. Я не уверен, как реализовать это прямо сейчас, поэтому я просто использую ключевые слова bounds.

Неограниченная оптимизация с границами работает нормально. Я просто передаю свой список расписаний как первое предположение.

 scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list) ) 

и выход так же хорош, как это может быть:

 Optimization terminated successfully. (Exit mode 0) Current function value: -33.0 Iterations: 2 Function evaluations: 20 Gradient evaluations: 2 Out[8]: array([ 1., 1., 1., 1., 1., 1., 1., 1.]) 

Без каких-либо дополнительных ограничений это оптимальное решение!

Используя ограниченную оптимизацию с помощью следующей команды:

 scipy.optimize.fmin_slsqp( price_func, schedule_list, args=price_list, bounds=[[0,1]]*len(schedule_list), eqcons=[eqcon, ] ) 

дает мне ошибку:

 Singular matrix C in LSQ subproblem (Exit mode 6) Current function value: -0.0 Iterations: 1 Function evaluations: 10 Gradient evaluations: 1 Out[9]: array([ 0., 0., 0., 0., 0., 0., 0., 0.]) 

Из gnuplot я знаю, что это часто связано с нечувствительными вопросами или плохими начальными значениями. Я попробовал почти оптимальные начальные значения, но это не помогает. У кого-нибудь есть идея или даже решение для меня?

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

2 Solutions collect form web for “Использование scipy.optimize.fmin_slsqp”

У вас простая линейная программа, верно?

 min: - prices . x constrain: x >= 0, sum x = 4 

поэтому вторая производная матрица aka Hessian равна точно 0.
slsqp пытается инвертировать это – невозможно. Согласившись, сообщение об ошибке может быть лучше.
(То же самое произойдет с другими квадратичными методами, в любом пакете: они будут сходиться намного быстрее на гладких функциях, но сбой на грубых скалах.)

См. Также почему-cant-i-rig-scipys-constrained-optimization-for-integer-programming –
но LP должен выполнять задание (макс. 4), программирование целых чисел сложнее.

Алгоритм SLSQP представляет собой оптимизатор на основе градиента, то есть он ожидает, что производные объектива и ограничений будут непрерывными. По моему мнению, кажется, что вы пытаетесь решить проблему целочисленного программирования (непрерывные значения в списке расписания неприемлемы). Вам нужен алгоритм, который выбирает соответствующие значения (0 или 1) для независимых переменных, а не пытается найти минимум непрерывного пространства значений. К сожалению, я не уверен, что в scipy есть что-то подобное.

  • Подмножество матричного умножения, быстрого и разреженного
  • экспорт из / импорта в numpy, scipy в форматах SQLite и HDF5
  • Python: найти принципиальное значение целого численного
  • Вычислить все возможные разности столбцов в матрице
  • Т-тест в Pandas (Python)
  • Структура входных данных для функции минимизации scipy
  • Линейная регрессия с использованием scipy.ODR не выполняется (не полный ранг в решении)
  • запустите np.empty во второй раз
  • ошибка при установке scipy модуля в python
  • Есть ли способ добавить точки к реализации дерева KD в Scipy
  • Python: проектирование фильтра временных рядов после анализа Фурье
  • Python - лучший язык программирования в мире.