我正在使用scipy.optimize
来解决最小化问题。但它正在做的事情没有任何意义。如果我没有设置最大迭代次数,它将永远运行(至少12小时)。所以我将最大迭代次数设置为小的测试,比如20。
我的函数的初始值是880.770191886。当我使用full_output=True
的所有诊断输出(retall=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 :(得分:0)
我猜你正在解决的问题并不是真的不适合和scipy.fmin可以通过很少的迭代收敛到非常好的结果,但是因为你只定义它试图实现的maxiter
参数你的申请。您是否尝试使用xtol
或ftol
参数。您还没有提到您正在使用的SciPy版本,但它们可以从0.11开始提供。
从0.11开始,您还可以使用scipy.minimize
,这可以让您更好地控制方法及其参数。