2009-08-24 17 views
0

私はscipyでl_bfgs制約最適化ルーチンを使用して関数を最適化しようとしています。 しかし、最適化ルーチンは値を関数に渡しますが、これは境界にはありません。私の完全なコードは次のように見えますは、境界値で厳密にパラメータ値を制限する

、初期値(初期)との境界(間隔) OPT = optimize.fmin_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 #### 

渡されるべきは「境界」であるべきである。この繰り返し-4.4139714で様々なイテレーション

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] 

で渡された値以下case..seeは私の第二のパラメータに渡されますが、それは私がドン-4.4139714来るところから、(10.0、50000.0)から変化すべきではない厥知っている?

ここでコードを変更する必要がありますか?境界内にあるべき値を渡したようにする

+0

コード内の余分な行を削除してください。 – NicDumZ

+0

@NicDumZ:自分でやってみませんか? –

+0

@ジョアヒム:それを行うには2Kの担当者が必要なので? – tonfa

答えて

1

浮動小数点数のビット単位の排他的論理和演算子(^演算子)は意味をなさないので、あなたのコードは実際にあなたが持っているコードではないと思いますの問題。しかし、私はあなたが意味していたと仮定して^に**を変更し、問題はありませんでした。そのコードは私のためにうまくいきました。パラメータは定義どおりに制限されます。

Python 2.5。

+0

はい私は**、私はこの場合は上質だが、いくつかのケースは境界を越えて行く、何を使用する権利ですか?どのように境界で制限するのですか? –

+0

実際に境界を越えるときの例を挙げることができますか?私にとってはそうではありません。 –

+0

患者さんありがとうございました。私の編集したコードをご覧ください。 –

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 
+0

S.Lottに感謝しますが、値は間隔を逸脱します。 私に編集コードを見てください、あなたはいくつかのアイデアを得るかもしれません –

関連する問題