Задача
Я думаю, scipy.optimize.minimize
не может использовать 2D-границы.
Я могу обойти проблему следующим образом:
- изменить формуввод массива
minimize
в 1D - преобразование массивов обратно в 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'
.