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)