2017-11-28 11 views
1

SciPyでブルートフォース最適化を実行しようとしています。scipyブルート最適化でfminに最大反復を渡す方法

(SPOとして輸入scipy.optimize)

res_brute = spo.brute(self.minimize_this、 rranges、full_output =真、仕上げ= spo.fmin)

私の質問があります:N回の繰り返し後にspo.fminが停止することを確認するにはどうすればよいですか?私はそれに引数を渡すように見えることはできません。

答えて

1

bruteは、最小化関数に追加の引数を渡すためのオプションを持っていないので、デフォルトの動作を上書きするために、あなたはfminのとラッパーでラッパーを作成する必要があります、maxiter引数を設定します。ラッパーはfinish引数としてbruteに渡されます。例えば

、我々は区間[0、10]の

def func(x): 
    return np.cos(3*x) + 0.25*(x-5)**2 

の最小値をしたい、と我々は4にfminの反復の最大数を制限したいとすると、ここでそれを行うことができる方法です(ipythonセッションで)。

まず、輸入:

In [102]: import numpy as np 

In [103]: from scipy.optimize import brute, fmin 

目的関数を定義します

In [104]: def func(x): 
    ...:  return np.cos(3*x) + 0.25*(x-5)**2 
    ...: 

コールbrutefinish引数のラムダ式を使用します。ラムダ式は、引数をfminfull_output=Truemaxiter=4と一緒に渡します。ここでの結果だ、比較のために

In [110]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=4)) 
Warning: Maximum number of iterations has been exceeded. 
Out[110]: array([ 5.2325]) 

(。代わりにラムダ式の、あなたは同じことを別の関数を定義することができます)ときmaxiter=100

In [111]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True, maxiter=100)) 
Optimization terminated successfully. 
     Current function value: -0.986810 
     Iterations: 13 
     Function evaluations: 26 
Out[111]: array([ 5.2235498]) 

そして、我々が使用していないときラムダ式でfminへの呼び出しでmaxiter

In [112]: brute(func, [slice(0, 10, 0.1)], finish=lambda func, x0, args=(): fmin(func, x0, args, full_output=True)) 
Optimization terminated successfully. 
     Current function value: -0.986810 
     Iterations: 13 
     Function evaluations: 26 
Out[112]: array([ 5.2235498]) 

が期待されるように、その結​​果はオーバーライドではないと同じですfinish

In [113]: brute(func, [slice(0, 10, 0.1)]) 
Out[113]: array([ 5.2235498]) 
関連する問題