SciPyでブルートフォース最適化を実行しようとしています。scipyブルート最適化でfminに最大反復を渡す方法
(SPOとして輸入scipy.optimize)
res_brute = spo.brute(self.minimize_this、 rranges、full_output =真、仕上げ= spo.fmin)
私の質問があります:N回の繰り返し後にspo.fminが停止することを確認するにはどうすればよいですか?私はそれに引数を渡すように見えることはできません。
SciPyでブルートフォース最適化を実行しようとしています。scipyブルート最適化でfminに最大反復を渡す方法
(SPOとして輸入scipy.optimize)
res_brute = spo.brute(self.minimize_this、 rranges、full_output =真、仕上げ= spo.fmin)
私の質問があります:N回の繰り返し後にspo.fminが停止することを確認するにはどうすればよいですか?私はそれに引数を渡すように見えることはできません。
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
...:
コールbrute
、finish
引数のラムダ式を使用します。ラムダ式は、引数をfmin
にfull_output=True
とmaxiter=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])