【问题标题】:Problem with bounds array shape in scipy.optimize constrained methodsscipy.optimize 约束方法中的边界数组形状问题
【发布时间】:2020-05-12 06:42:57
【问题描述】:

跟进my previous question 现在我对constrained bfgs method 中的边界数组的形状有疑问。

我的代码如下:

nr      = 5
lag     = 1


guess       =numpy.array([[[ random.uniform(-1.0,1.0) for k in range(nr)] for l in range(lag)],
                          [[ random.uniform( 0.0,1.0) for k in range(nr)] for l in range(lag)],
                          [[ random.uniform(-1.0,1.0) for k in range(nr)] for l in range(lag)]])

bounds      =numpy.array([[[ [-1.0,1.0] for k in range(nr)] for l in range(lag)],
                          [[ [ 0.0,1.0] for k in range(nr)] for l in range(lag)],
                          [[ [-1.0,1.0] for k in range(nr)] for l in range(lag)]])

result      =   optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2) ) 

如您所见,我从 (3,1,5) 形状的列表列表开始,这是我在 myfunc() 中使用的首选格式,因为它很容易用嵌套的 for 循环解析。然后这个列表被压缩成一个 (15,) 形状的 numpy 数组以满足 x0 参数的格式需求,但不要担心,因为 myfunc() 中的 X 值随后会转换回我的 (3,1,5 ) 通过X=X.reshape(origshape) 格式化,其中origshape 全局变量将保存原始格式。它可能看起来效率低下而且来回无用,但我找不到更容易的方法。

现在这适用于迄今为止的每个fmin_ 函数,除了fmin_l_bfgs_b 之类的边界,我无法弄清楚有界值需要采用什么形状。文档说:

"x 中每个元素的(min, max) 对,定义该参数的边界。"

所以我认为这意味着每个元素有 1 对,所以在我的情况下是 (15,2) 形状,但是当我使用上面的代码时,它给了我以下错误:

TypeError: 'float' object is not subscriptable

所以我想我弄错了形状。请帮我解决这个问题。

【问题讨论】:

    标签: arrays python-3.x numpy scipy scipy-optimize


    【解决方案1】:
    result      =   optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2),approx_grad=True ) 
    

    如果不将approx_grad 变量设置为True,它似乎不起作用。否则我猜你需要指定 fprime 函数。

    无论哪种方式,该功能似乎都被贬低了,使用scipy.optimize.minimize 功能更好。

    【讨论】:

      猜你喜欢
      • 2017-05-23
      • 1970-01-01
      • 2018-11-12
      • 2019-03-12
      • 2019-11-14
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多