2012-11-23 72 views
2

我使用scipy.optimize來解決最小化問題。但它所做的沒有任何意義。如果我沒有設置最大迭代次數,它會永遠運行(至少12小時)。所以我把迭代的最大次數設置爲小測試,比如20。scipy.optimize令人困惑的行爲

我函數的初始值是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等。然而,它試圖在每次迭代中使用的向量與初始向量相同!所以它實際上並沒有做任何事情,即使它確定了最低限度。我只是將初始向量作爲每一步顯然不正確的答案而退出。

任何想法是什麼問題?我看不出任何工作方式的理由,因爲它清楚地標識出某個值小於初始值的函數值。

+0

最終的向量是什麼樣的?另外,你能否證實這20個矢量都是平等的?我的意思是,我們在這裏看不到所有的座標。 –

+0

@LevLevitsky是的,如果我從最初減去最後,我在每個位置得到0。如果我在迭代中從原始數據中減去每個數組,則相同。 – tpg2114

+0

那麼最後是一樣的嗎? 'optimize_grid(dataOut [0],0.5,(65,86,2))'仍然是880而不是197? –

回答

0

我想你正在解決的問題並不是真的不合適,scipy.fmin可以通過很少的迭代收斂到很好的結果,但是因爲你只定義了maxiter參數,它試圖滿足你的請求。您是否嘗試使用xtolftol參數。您尚未提及您正在使用的SciPy版本,但它們可從0.11獲得。

從0.11開始,您還可以使用,它可以讓您更好地控制方法及其參數。