【问题标题】:to restrict parameter values strictly with in bounds严格限制参数值在范围内
【发布时间】:2010-11-22 06:20:58
【问题描述】:

我正在尝试使用 scipy 中的 l_bfgs 约束优化例程来优化函数。 但是优化例程将值传递给函数,这些值不在 Bounds 中。

我的完整代码看起来像,

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 从哪里来?

我应该在哪里更改代码?以便它传递应该在范围内的值

【问题讨论】:

  • 有人请删除代码中多余的行...
  • @NicDumZ:为什么不自己做呢?
  • @Joachim:因为你需要 2k 代表才能做到这一点?
  • @pear:请发布您遇到问题的实际代码。浮点值的“^”不能正确。
  • @tonfa:很公平。 @NicDumZ:抱歉。

标签: python scipy


【解决方案1】:

您正在尝试对浮点数进行按位异或(^ 运算符),这是没有意义的,所以我认为您的代码实际上并不是您遇到问题的代码。但是,我将 ^ 更改为 ** 假设这就是您的意思,并且没有问题。有了这个改变,代码对我来说效果很好。参数完全按照定义进行限制。

Python 2.5。

【讨论】:

  • 是的,你是对的,我用过 ** ,在这种情况下它很好,但在某些情况下它超出了界限,该怎么办?如何在范围内限制?
  • 你能举个例子说明它什么时候超出了界限,因为对我来说它没有。
【解决方案2】:

你是在问做这样的事情吗?

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

【讨论】:

  • 感谢 S.Lott,但值偏离了区间。请看我编辑的代码,你可能会有所了解
猜你喜欢
  • 1970-01-01
  • 2018-12-26
  • 2016-05-04
  • 2011-04-19
  • 1970-01-01
  • 2018-08-30
  • 2017-05-22
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多