代码之家  ›  专栏  ›  技术社区  ›  R zu

scipy.optimize.minimize不能使用二维或标量边界

  •  0
  • R zu  · 技术社区  · 7 年前

    我猜 scipy.optimize.minimize 无法使用二维边界。

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

    1. 将输入重塑为 minimize
    2. 在目标函数中将阵列重塑为二维。

    但这很乏味。

    我做错什么了吗?或 减少

    在我的例子中,变量应该都在0和1之间。

    谢谢

    doc 对于1.1.0版,说明边界可以是数组:

    scipy.optimize.Bounds

    lb,ub:类似阵列,可选

    每个数组必须具有 与x大小相同或可以是标量 ,在这种情况下,将使用边界 所有变量都是相同的。 ...

    • 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()
    

    我发现 减少

    我明白了 'length of x0 != length of bounds' .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    docs

    x0:Ndaray, 形状(n,)

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