2

私はscipy.optimize最小化問題を解くために使用しています。しかし、それが何をしているのかは意味がありません。最大反復回数を設定しないと、永久に実行されます(少なくとも、12時間)。そこで、最大反復回数をテストする小さな値、たとえば20に設定しました。

私の関数の初期値は880.770191886です。のすべての診断出力(full_output=Trueretall=True)を使用して実行するとscipy.optimize.fmin、次のようになります。

>>dataOut = so.fmin(optimize_grid, coordsOuter, args=(0.5,(65,86,2)), maxiter=20, disp=True, full_output=True, retall=True)                                                         
>>print dataOut[1:]

与える:

Warning: Maximum number of iterations has been exceeded
(197.24011337756517, 20, 11207, 2, [array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373]), array([ 0.5       ,  0.5       ,  0.55702654, ...,  2.45997569,
    2.47487373,  2.47487373])])

つまり、私の関数の最小値は197.24などの値をとるということです。それでも、すべての反復で使用しようとしたベクトルは、初期ベクトルと同じです。したがって、最小値を特定したとしても、実際には何もしていません。明らかに正しくないすべてのステップで、答えとして最初のベクトルを取得します。

問題は何ですか?ある時点で、初期値よりも小さい関数の値が明確に識別されたため、その動作の正当性がわかりません。

4

1 に答える 1

0

あなたが解決しようとしている問題は実際には不適切な設定ではなく、scipy.fmin はほとんど反復せずに非常に良い結果に収束できると思いますが、maxiterパラメーターを定義するだけでリクエストを実行しようとするためです。xtolまたはftolパラメータを使用してみましたか。使用している SciPy のバージョンについては言及していませんが、0.11 から利用できます。

0.11 からscipy.minimizeは、メソッドとそのパラメーターをより詳細に制御できるようにすることもできます。

于 2013-07-25T22:27:12.003 に答える