scipy.optimize.minimize无法使用2D或标量边界

时间:2018-12-26 20:24:34

标签: python numpy optimization scipy

问题

我想scipy.optimize.minimize不能使用2D边界。

我可以通过以下方法解决此问题:

  1. minimize的输入重塑为一维数组
  2. 在目标函数中将阵列重塑回2D。

但这很乏味。

我做错了吗?还是minimize真的不能使用2D边界?

在我的情况下,变量应全部在0到1之间。

谢谢。

文档

1.1.0版的doc说界限可以是一个数组:

  

scipy.optimize.Bounds

     

...

     

参数:

     

lb,ub:array_like,可选

     

自变量的上下限。 每个数组必须具有   与x相同或为标量,在这种情况下,边界为   所有变量都一样。   ...

版本

  • Python 3.6.2 | Anaconda自定义(64位)
  • numpy:anaconda中的1.14.2
  • 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'

1 个答案:

答案 0 :(得分:1)

docs

  

x0:ndarray,形状(n,)

     

初步猜测。大小为(n,)的实际元素的数组,其中“ n”是自变量的数量。

显然,是的,只接受一维数组作为输入