Scipy.optimize.minimize не может использовать 2D или скалярные границы

Проблема

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

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

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

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

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

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

Спасибо.

Док

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

scipy.optimize.Bounds

...

Parameters:

lb, ub : array_like, optional

Lower and upper bounds on independent variables. Each array must have the same size as x or be a scalar, in which case a bound will be the same for all the variables. ...

Версии

  • Python 3.6.2 | Anaconda custom (64-разрядная версия)
  • numpy: 1.14.2 в анаконде
  • scipy: 1.1.0 в анаконде

Контрольная работа

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'.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
751
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От документы

x0 : ndarray, shape (n,)

Initial guess. Array of real elements of size (n,), where ‘n’ is the number of independent variables.

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

Другие вопросы по теме