scipy.optimize.minimize не может использовать 2D или скалярные границы - PullRequest
0 голосов
/ 26 декабря 2018

Задача

Я думаю, scipy.optimize.minimize не может использовать 2D-границы.

Я могу обойти проблему следующим образом:

  1. изменить формуввод массива minimize в 1D
  2. преобразование массивов обратно в 2D в целевой функции.

Но это утомительно.

Неужели я что-то не так сделал??Или minimize действительно не может использовать 2D-границы?

В моем случае все переменные должны быть между 0 и 1.

Спасибо.

Документ

Документ для версии 1.1.0 говорит, что границы могут быть массивом:

scipy.optimize.Bounds

...

Параметры:

фунт, ub: массив_подобный, необязательный

Нижние и верхние оценки независимых переменных. Каждый массив должен иметь одинаковый размер с x или быть скалярным , и в этом случае граница будет одинаковой для всех переменных....

Версии

  • Python 3.6.2 | Anaconda custom (64-bit)
  • numpy: 1.14.2 в anaconda
  • scipy: 1.1.0 в anaconda

Тест

import numpy as np
import scipy
import scipy.optimize as opt 


def obj(x):
    return x.sum()


def main():
    x = np.ones((3, 4)) 
    bounds = opt.Bounds(np.zeros(x.shape), 
                        np.ones(x.shape))
    r = opt.minimize(obj, x, bounds=bounds)
    print(r)


main()

Результат

Traceback (most recent call last):
  File "scipy_bounds.py", line 16, in <module>
    main()
  File "scipy_bounds.py", line 12, in main
    r = opt.minimize(obj, x, bounds=bounds)
  File "<...>/site-packages/scipy/optimize/_minimize.py", line 584, in minimize
    bounds = new_bounds_to_old(bounds.lb, bounds.ub, x0.shape[0])
  File "<...>/site-packages/scipy/optimize/_constraints.py", line 259, in new_bounds_to_old
    lb = [x if x > -np.inf else None for x in lb]
  File "<...>/site-packages/scipy/optimize/_constraints.py", line 259, in <listcomp>
    lb = [x if x > -np.inf else None for x in lb]
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Я обнаружил, что minimize также не позволяет мне использовать скалярные границы.

Я получаю 'length of x0 != length of bounds'.

1 Ответ

0 голосов
/ 02 января 2019

Из документов

x0: ndarray, shape (n,)

Начальное предположение.Массив вещественных элементов размера (n,), где 'n' - количество независимых переменных.

Так что, очевидно, да, в качестве входных данных принимаются только одномерные массивы

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