严格限制参数值在范围内
我正在尝试使用scipy中的l_bfgs约束优化方法来优化一个函数。但是,这个优化过程传递给我的函数的值,有些并不在设定的范围内。
我的完整代码如下:
def humpy(aParams):
aParams = numpy.asarray(aParams)
print aParams
####
# connect to some other software for simulation
# data[1] & data[2] are read
##### objective function
val = sum(0.5*(data[1] - data[2])**2)
print val
return val
####
def approx_fprime():
####
Initial = numpy.asarray([10.0, 15.0, 50.0, 10.0])
interval = [(5.0, 60000.0),(10.0, 50000.0),(26.0, 100000.0),(8.0, 50000.0)]
opt = optimize.fmin_l_bfgs(humpy,Initial,fprime=approx_fprime, bounds=interval ,pgtol=1.0000000000001e-05,iprint=1, maxfun=50000)
print 'optimized parameters',opt[0]
print 'Optimized function value', opt[1]
####### the end ####
根据初始值(Initial)和范围(interval),opt = optimize.fmin_l_bfgs()会将一些值传递给我的软件进行模拟,但这些传递的值应该在'范围'之内。可实际上并不是这样……看看下面在不同迭代中传递的值:
iter 1 = [ 10.23534209 15.1717302 50.5117245 10.28731118]
iter 2 = [ 10.23534209 15.1717302 50.01160842 10.39018429]
[ 11.17671043 15.85865102 50.05804208 11.43655591]
[ 11.17671043 15.85865102 50.05804208 11.43655591]
[ 11.28847754 15.85865102 50.05804208 11.43655591]
[ 11.17671043 16.01723753 50.05804208 11.43655591]
[ 11.17671043 15.85865102 50.5586225 11.43655591]
...............
...............
...............
[ 49.84670071 -4.4139714 62.2536381 23.3155698847]
在这次迭代中,-4.4139714被传递给了我的第二个参数,但这个参数的值应该在(10.0, 50000.0)之间。我不知道-4.4139714是从哪里来的?
我应该在代码的哪个地方进行修改,以确保传递的值在设定的范围内?
2 个回答
0
你是在问怎么做类似这样的事情吗?
def humpy(aParams):
aParams = numpy.asarray(aParams)
x = aParams[0]
y = aParams[1]
z = aParams[2]
u = aParams[3]
v = aParams[4]
assert 2 <= x <= 50000
assert 1 <= y <= 35000
assert 1 <= z <= 45000
assert 2 <= u <= 50000
assert 2 <= v <= 60000
val=100.0*((y-x**2.0)^2.0+(z-y**2.0)^2.0+(u-z**2.0)^2.0+(v-u**2.0)^2.0)+(1-x)^2.0+(1-y)^2.0+(1-z)^2.0+(1-u)^2.0
return val
1
你在对浮点数使用按位异或运算符(^),这其实是没什么意义的,所以我觉得你遇到问题的代码可能不是这个。不过,我把^改成了**,我猜这才是你想要的,结果没有问题。改了之后代码运行得很好。参数的限制正好是按照定义来的。
这是在Python 2.5版本下的情况。