У меня проблема с некоторыми недавними изменениями, которые я внес в свою программу оптимизации scipy. Я использую метод COBYLA с ограничениями.
Задача началась с простой оптимизации области под выпуклой монотонно убывающей кривой с использованием алгоритма суммы Римана в качестве моей целевой функции. Кривая выглядела примерно так:
Поскольку я хочу решить проблему так, чтобы мои прямоугольники всегда содержались под кривой (что всегда положительно ), Я хочу взять минимальное значение y для каждого прямоугольника. В этом тривиальном случае это просто означает получение значения y («единиц») в правой части каждого поля, например:
mins = [dt.loc[x0[0],'units']]+[dt.loc[x0[i],'units'] for i in range(1,num-1)]
Имея эти значения в руках, я могу написать функция быстрой цели, где 'price' - это имя оси x в моих фактических данных, 'minprice' - это отдельно рассчитанное число, ограничивающее данные слева, а x0
- вектор, который я отправляю подпрограмма оптимизации с начальными догадками и для удержания конечного результата:
area = (dt.loc[x0[0],'price']-minprice)*mins[0] + np.sum([mins[i]*(dt.loc[x0[i],'price']-dt.loc[x0[i-1],'price']) for i in range(1,num-1)])
Этот код работает отлично. Тем не менее, когда я добавляю дополнительные морщинки go с рельсов. Давайте теперь скажем, что моя кривая не является необходимой выпуклой, и вместо этого выглядит примерно так:
Теперь мне нужно быть немного умнее как я нахожу координату Y для каждого прямоугольника. Вместо того, чтобы брать конечную точку, мне нужно взять минимум для диапазона значений, поэтому я попробовал это:
mins = [np.min(dt.loc[:x0[0],'units'])]+[np.min(dt.loc[(x0[i-1]+1):x0[i],'units']) for i in range(1,num-1)]
Однако, когда я включаю эти значения минут в мое уравнение для области, я получаю ошибки , Код будет работать около 10 циклов. Затем он вернет массив x0
из nan
(мое действительное число желаемых результатов больше, чем в приведенном примере):
x0 = [nan nan nan nan nan nan nan nan]
После этого произойдет сбой, поскольку nan
очевидно, не является приемлемым показателем для моих .loc
функций. Тогда возникает вопрос: почему моя процедура минимизации (с использованием scipy.optimize.fmin_cobyla
) начинает генерировать значения nan
? Почему это работает для одного набора значений, а не для другого? Хотя метод получения вектора mins
различен в двух методах, оба раза я посылаю вектор с плавающей точкой одинакового размера.
Я читал в другом месте онлайн, что возвращается nan
Это может быть связано с нарушением ограничений, но я убедился, что на этапе, когда он не выполняется, ограничения не нарушаются. Все индексы и значения на предыдущих этапах являются действительными значениями (т. Е. Находятся в dt
). Я застрял и был бы признателен за любые отзывы.
РЕДАКТИРОВАТЬ: я обнаружил, что он всегда умирает на следующей итерации после длины x0
. Поэтому, если я ожидаю 10 значений в моем выходном векторе, он умирает на итерации № 11. Если я ожидаю 9, он умирает на итерации № 10.