【问题标题】:scipy.optimize.minimize cannot use 2D or scalar boundsscipy.optimize.minimize 不能使用 2D 或标量边界
【发布时间】:2018-12-26 20:24:33
【问题描述】:

问题

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

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

  1. minimize 的输入重新整形为一维数组
  2. 在目标函数内将数组重新整形为二维。

但这很乏味。

我做错了吗?还是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


    【解决方案1】:

    来自docs

    x0 : ndarray, 形状 (n,)

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2016-03-07
      • 2018-10-25
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多