scipy.optimize 约束方法中的边界数组形状问题
Problem with bounds array shape in scipy.optimize constrained methods
跟进 now I have a problem with the shape of the bounds array in the 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 解析loops.Then 这个列表被压缩成一个 (15,) 形的 numpy 数组以满足 x0
参数的格式需求,但不要担心,因为 X
值在 myfunc()
然后通过 X=X.reshape(origshape)
转换回我的 (3,1,5) 格式,其中 origshape
全局变量将保存原始格式。它可能看起来效率低下并且来回无用,但我找不到更容易的方法。
现在这适用于每个 fmin_
函数,除了像 fmin_l_bfgs_b
这样的边界,我无法弄清楚边界值需要的形状。文档说:
"(min, max) pairs for each element in x, defining the bounds on that parameter."
所以我认为这意味着每个元素 1 对,所以在我的情况下是 (15,2) 形状,但是当我使用上面的代码时,它给了我以下错误:
TypeError: 'float' object is not subscriptable
所以我想我弄错了形状。请帮我解决这个问题。
result = optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2),approx_grad=True )
如果不将 approx_grad
变量设置为 True,它似乎不起作用。否则我猜你需要指定 fprime 函数。
无论哪种方式,该功能似乎都已贬值,使用 scipy.optimize.minimize
功能更好。
跟进
我的代码如下:
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 解析loops.Then 这个列表被压缩成一个 (15,) 形的 numpy 数组以满足 x0
参数的格式需求,但不要担心,因为 X
值在 myfunc()
然后通过 X=X.reshape(origshape)
转换回我的 (3,1,5) 格式,其中 origshape
全局变量将保存原始格式。它可能看起来效率低下并且来回无用,但我找不到更容易的方法。
现在这适用于每个 fmin_
函数,除了像 fmin_l_bfgs_b
这样的边界,我无法弄清楚边界值需要的形状。文档说:
"(min, max) pairs for each element in x, defining the bounds on that parameter."
所以我认为这意味着每个元素 1 对,所以在我的情况下是 (15,2) 形状,但是当我使用上面的代码时,它给了我以下错误:
TypeError: 'float' object is not subscriptable
所以我想我弄错了形状。请帮我解决这个问题。
result = optimize.fmin_l_bfgs_b( myfunc,guess.flatten(),bounds=bounds.reshape(15,2),approx_grad=True )
如果不将 approx_grad
变量设置为 True,它似乎不起作用。否则我猜你需要指定 fprime 函数。
无论哪种方式,该功能似乎都已贬值,使用 scipy.optimize.minimize
功能更好。