【发布时间】:2018-12-26 20:24:33
【问题描述】:
问题
我猜scipy.optimize.minimize 不能使用 2D 边界。
我可以通过以下方式解决该问题:
- 将
minimize的输入重新整形为一维数组 - 在目标函数内将数组重新整形为二维。
但这很乏味。
我做错了吗?还是minimize 真的不能使用二维边界?
在我的例子中,变量应该都在 0 和 1 之间。
谢谢。
文档
1.1.0 版的doc 表示边界可以是一个数组:
scipy.optimize.Bounds
...
参数:
lb, ub : array_like, 可选
自变量的下限和上限。 每个数组必须有 与 x 大小相同或为标量,在这种情况下,边界将是 所有变量都相同。 ...
版本
- Python 3.6.2 |Anaconda 自定义(64 位)
- numpy: 1.14.2 in anaconda
- scipy:anaconda 中的 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 numpy optimization scipy