【问题标题】:Scipy optimize: Set maximum errorScipy优化:设置最大误差
【发布时间】:2013-09-19 01:40:16
【问题描述】:

我正在尝试使用 scipy 优化 4 维函数。到目前为止一切正常,除了我对解决方案的质量不满意。现在我有地面实况数据,我用它来验证我的代码。到目前为止我得到的是:

End error:  1.52606896507e-05
End Gradient:  [ -1.17291295e-05   2.60362493e-05   5.15347856e-06  -2.72388430e-05]

Ground Truth:   [0.07999999..., 0.0178329..., 0.9372903878..., 1.7756283966...]
Reconstructed:  [ 0.08375729  0.01226504  1.13730592  0.21389899]

错误本身听起来不错,但由于值完全错误,我想强制优化算法 (BFGS) 执行更多步骤。

在文档中,我找到了“gtol”和“norm”选项,并尝试将两者都设置为非常小的值(例如 0.0000001),但似乎没有任何改变。

背景: 问题是,我试图解调波,所以我有 sin 和 cos 项,并且可能有许多局部(或全局)最小值。我使用蛮力搜索来找到一个好的起点,女巫帮了很多忙,但目前似乎大部分工作都是由蛮力搜索完成的,因为优化通常只使用一个迭代步骤。所以我试图以某种方式改进这部分计算。

【问题讨论】:

  • 我对波浪了解不多,但在我看来,您的公差与局部极值之间的距离之间应该存在关系。如果您的容差远小于这样的距离,那么您将陷入最近的局部极值。想到的另一个问题:你的目标函数有鞍点吗?您可以在 Hessian 的蛮力步骤中做些什么来避免这些?
  • 我的猜测是分析梯度有助于优化。如果您使用“Ground Truth”作为起始值,优化是否真的停留在那里并为目标函数提供更好的值?

标签: python scipy mathematical-optimization


【解决方案1】:

许多局部最小值 + 粗略搜索后几乎没有任何改进,这听起来很糟糕。很难说您在问题中提供的详细程度非常具体,所以这里有一些模糊的想法可以尝试(基本上,如果我怀疑我的最小化器卡住了我会怎么做):

  • 尝试从一堆不同的初始猜测中手动启动最小化器。
  • 尝试使用随机最小化器。你正在标记一个问题scipy,所以试试basinhopping
  • 如果最坏的情况发生,只需将随机点放入一个循环中,让它在午休时间(或通宵)工作

此外,波、正弦和余弦 --- 如果您可以在傅立叶空间中重新表述您的问题,这可能会很有用。

【讨论】:

    【解决方案2】:

    我发现起点的渐变已经很平了(值在 10^-5 中),所以我尝试缩放我已经提供的渐变函数。这似乎非常有效,我可以强制算法执行更多步骤,我的结果现在要好得多。 虽然它们并不完美,但对此问题的完整讨论超出了这个问题的范围,所以我可能会开始一个新的讨论,从下到上描述整个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2019-11-18
      • 2019-12-07
      • 2016-08-13
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多