строго ограничивать значения параметров в пределах

Я пытаюсь оптимизировать функцию, используя процедуру оптимизации ограничения 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 ####

на основе начальных значений (Начальное) и границ (интервал) 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, я не знаю?

где мне изменить код? чтобы он передавал значения, которые должны быть в границах


person Community    schedule 24.08.2009    source источник
comment
кто-нибудь, пожалуйста, удалите лишние строки в коде ...   -  person Nicolas Dumazet    schedule 24.08.2009
comment
@NicDumZ: почему бы просто не сделать это самому?   -  person Joachim Sauer    schedule 24.08.2009
comment
@Joachim: потому что для этого нужно 2k rep?   -  person tonfa    schedule 24.08.2009
comment
@pear: опубликуйте актуальный код, с которым у вас возникли проблемы. ^ Для значений с плавающей запятой не может быть правильным.   -  person S.Lott    schedule 24.08.2009
comment
@tonfa: достаточно честно. @NicDumZ: извините.   -  person Joachim Sauer    schedule 24.08.2009
comment
Да, этот код я не могу запустить и не могу исправить, чтобы он работал, я не понимаю, что именно вы пытаетесь сделать, поскольку теперь вы вызываете оптимизацию в функции fprime. Полагаю, мое остроумное понимание иссякло ... :)   -  person Lennart Regebro    schedule 24.08.2009


Ответы (2)


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

Python 2.5.

person Lennart Regebro    schedule 24.08.2009
comment
да, вы правы, я использовал **, в этом случае все в порядке, но в некоторых случаях это выходит за рамки, что делать? как ограничить в пределах? - person ; 24.08.2009
comment
Можете ли вы привести пример, когда это действительно выходит за рамки, потому что для меня это не так. - person Lennart Regebro; 24.08.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
person S.Lott    schedule 24.08.2009
comment
Спасибо S.Lott, но значение отклоняется от интервала. пожалуйста, посмотрите, как я отредактировал код, вы можете получить некоторое представление - person ; 24.08.2009