Python 在scipy上用optimize.fmin求收敛
我想用Python 在scipy上用optimize.fmin求收敛,python,optimization,scipy,Python,Optimization,Scipy,我想用scipy.optimize.fmin最小化一个函数。请注意,在计算函数时,我强制打印 我的问题是,当我开始最小化时,打印的值会减小,直到达到某一点(值46700222.800)。在那里,它继续以非常小的比例下降,例如46700222.7974670022.7654670022.7454670022.6994670022.6884670022.678 直觉上,我觉得我已经达到了最小值,因为每一步的长度都是负1。但该算法一直运行,直到我得到一个“函数求值的最大数量已超过”错误 我的问题是:当
scipy.optimize.fmin
最小化一个函数。请注意,在计算函数时,我强制打印
我的问题是,当我开始最小化时,打印的值会减小,直到达到某一点(值46700222.800)。在那里,它继续以非常小的比例下降,例如46700222.7974670022.7654670022.7454670022.6994670022.6884670022.678
直觉上,我觉得我已经达到了最小值,因为每一步的长度都是负1。但该算法一直运行,直到我得到一个“函数求值的最大数量已超过”错误
我的问题是:当函数求值达到一个不再真正进化的值时(比方说,迭代后我的增益不超过1),我如何强制我的算法接受参数的值。我读到可以使用选项ftol
,但它对我的代码绝对没有影响。事实上,我甚至不知道该为ftol
设置什么值。我尝试了从0.00001到10000的所有方法,但仍然没有收敛。从中可以看出,您确实希望更改ftol
arg
发布您的代码,以便我们查看您的进度。
编辑:同时尝试增加xtol
。您的问题有点含糊不清。您是打印函数的值,还是打印函数的求值点
我对xtol
和ftol
的理解如下。迭代停止
- 迭代之间函数值的变化小于
ftol
及
- 当连续迭代之间
x
的变化小于xtol
当您说“…接受参数的值…”时,这表明您应该更改xtol
我刚刚花了三个小时研究了的源代码。其中,“while”循环函数“\u minimize\u neldermead”处理收敛规则:
if (numpy.max(numpy.ravel(numpy.abs(sim[1:] - sim[0]))) <= xtol and
numpy.max(numpy.abs(fsim[0] - fsim[1:])) <= ftol):
break"
if(numpy.max(numpy.ravel(numpy.abs(sim[1:]-sim[0]))实际上没有必要查看您的代码来解释正在发生的事情。我将逐一引用您的回答
我的问题是,当我开始最小化时,打印的值会减小
直到它达到某一点(值46700222.800)。它就在那里
继续以非常小的幅度减少,例如。,
46700222.7974670022.7654670022.7454670022.6994670022.6884670022.678
请注意,最后两个值之间的差值为-0.00999979913837433
,即大约1e-2
。在最小化算法的惯例中,您所称的值通常标记为x
。如果在n
第次迭代中同时满足这两个条件,则算法停止:
- 收敛于
x
:x[n]
和下一次迭代x[n+1]
之间的差值的绝对值小于xtol
- 在
f(x)
:f[n]
和f[n+1]
之间差值的绝对值小于ftol
此外,如果达到最大迭代次数,算法也会停止
现在请注意,xtol
的默认值为1e-4
,大约是您案例中出现的1e-2
值的100倍。然后,算法不会停止,因为xtol
的第一个条件在达到最大迭代次数之前不会得到遵守
我读到ftol选项可以使用,但它绝对没有
对我的代码的影响。事实上,我甚至不知道该为什么值
ftol。我尝试了从0.00001到10000的所有方法,但仍然没有成功
趋同
这有助于您遵守ftol
上的第二个条件,但第一个条件从未达到
要达到您的目标,请同时增加xtol
在调试优化例程的收敛性时,以下方法也将在总体上帮助您
- 在要最小化的函数内部,在返回前打印
x
的值和f(x)
的值。然后运行优化例程。从这些打印中,您可以确定xtol
和ftol
的合理值
- 考虑将问题无量纲化。如果
ftol
和xtol
都默认为1e-4
,这是有原因的。他们希望您制定问题,以便x
和f(x)
具有顺序O(1)
或O(10)
,表示介于-100
和+100
之间的数字。如果执行无量纲化,您将处理一个更简单的问题,您通常知道期望的值和所需的公差
- 如果您只对粗略的计算感兴趣,并且无法估计
xtol
和ftol
的典型值,并且您知道(或希望)您的问题表现良好,即它将收敛,那么您可以在try
块中运行fmin
,只传递到fmin
maxiter=20
(假设),并捕获有关已超过最大函数求值次数的错误
正如我在帖子中所说,我试图更改arg ftol,但没有任何帮助。事实上,它对收敛没有任何影响。我甚至不知道它是否是0到1之间的常数。正如seth所说,请发布代码,否则除了发送更多文档链接之外,我们什么都做不了。我可以将我的问题改为:有人知道吗必须使用w ftol和xtol?有人知道当达到某个非进化水平时如何强制收敛吗?这完全独立于任何代码位。我是
global x_old, Q_old
if (np.absolute(x_old-x).sum() <= 1e-4) and (np.absolute(Q_old-Q).sum() <= 1e-4):
return None
x_old = x; Q_old = Q
numpy.max(fsim[0] - fsim[1:]) <= ftol)