строго ограничивать значения параметров в границах - PullRequest
0 голосов
/ 24 августа 2009

Я пытаюсь оптимизировать функцию, используя подпрограмму оптимизации ограничений l_bfgs в scipy. Но подпрограмма оптимизации передает значения функции, которых нет в границах.

мой полный код выглядит как

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) и границ (интервала) 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 ]

1 голос
/ 24 августа 2009

Вы пытаетесь сделать битовое исключение или (оператор ^) для чисел с плавающей запятой, что не имеет смысла, поэтому я не думаю, что ваш код на самом деле является кодом, с которым у вас проблемы Однако я изменил ^ на **, предполагая, что это именно то, что вы имели в виду, и у меня не было проблем. Код работал хорошо для меня с этим изменением. Параметры ограничены в точности как определено.

Python 2.5.

0 голосов
/ 24 августа 2009

Вы спрашиваете о том, чтобы сделать что-то подобное?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...