scipy.optimize有令人困惑的行为

时间:2012-11-23 19:26:31

标签: python optimization scipy

我正在使用scipy.optimize来解决最小化问题。但它正在做的事情没有任何意义。如果我没有设置最大迭代次数,它将永远运行(至少12小时)。所以我将最大迭代次数设置为小的测试,比如20。

我的函数的初始值是880.770191886。当我使用full_output=True的所有诊断输出(retall=Truescipy.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等。然而,它在每次迭代时尝试使用的向量与初始向量相同!所以它实际上并没有做任何事情,即使它确定了最低限度。我只是将初始向量作为答案在每一步显然都不正确。

任何想法是什么问题?我看不出它工作方式的任何理由,因为它在某个时候清楚地确定了函数的值小于初始值。

1 个答案:

答案 0 :(得分:0)

我猜你正在解决的问题并不是真的不适合和scipy.fmin可以通过很少的迭代收敛到非常好的结果,但是因为你只定义它试图实现的maxiter参数你的申请。您是否尝试使用xtolftol参数。您还没有提到您正在使用的SciPy版本,但它们可以从0.11开始提供。

从0.11开始,您还可以使用scipy.minimize,这可以让您更好地控制方法及其参数。