0

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)とbounds(interval)に基づいてopt =optimize.fmin_l_bfgs()はシミュレーションのために値をソフトウェアに渡しますが、渡される値は「bounds」である必要があります。そうではありません。さまざまな反復で渡された値を以下に示します。

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が2番目のパラメーターに渡されますが、(10.0、50000.0)とは異なるはずです。どこから来るのか、-4.4139714わかりませんか?

コードのどこを変更すればよいですか?範囲内にあるはずの値を渡すように

4

2 に答える 2

1

float に対してビット単位の排他的 or (^ 演算子) を実行しようとしていますが、これは意味がありません。そのため、コードが実際に問題を抱えているコードではないと思います。ただし、それがあなたの意図したものであると仮定して、^を**に変更しましたが、問題はありませんでした。その変更により、コードはうまく機能しました。パラメータは定義どおりに制限されます。

パイソン 2.5。

于 2009-08-24T12:57:54.113 に答える
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
于 2009-08-24T13:28:06.140 に答える