Scipy 优化TNC方法,秤有什么作用? "unable to progress" 的解决方案?

Scipy Optimization TNC method, what does scale do ? solution to "unable to progress"?

我运行使用已知梯度(100 到 300 个变量)进行多重有界优化。有时,TNC 会返回 "unable to progress"。

对于我的 objective 函数,与 TNC 相比,L-BFGS-B 的速度要慢得多并且输出的结果也很差。 (可能是因为当变量数量很大时 TNC 更好) 使用带 L-BFGS-B 的 Basinhopping 和 niter_success 到 10,我得到的结果接近 TNC,速度慢 20 倍。当 TNC returns "unable to progress", "L-BFGS-B" returns 效果更好。所以我目前的解决方案是 运行 Basinhopping when TNC failed with status 6 - "unable to progress".

当TNC 无法减少objective 函数x 次迭代时,似乎返回了"unable to progress"。我玩了一些比例因子,结果不一致,我得到了更好的结果。

据我所知,优化问题中的规模让优化器知道哪个变量更有效。我有这些信息,我相信这会减少我收到的 "unable to progress" 的数量。根据文档, https://docs.scipy.org/doc/scipy/reference/optimize.minimize-tnc.html "The default scale array are up-low for interval bounded variables and 1+|x] fo the others"。所以它是上限 - 有界变量的下限,无法理解如何处理无界。 什么是 1+|x] ?

此外,我手动计算了 up - low 并将 unbounded 设置为 1,每次我 运行 使用相同的输入进行优化时,都会返回不同的结果。 (奇怪?)

我还尝试查看代码,TNC 如何处理比例尺,spicy wrapper 将空数组或输入数组发送到 C 代码 https://github.com/scipy/scipy/blob/master/scipy/optimize/tnc/moduleTNC.c。在 C 代码中,我无法找到比例数组的创建位置或使用方式。当 "unable to progress" 被触发时也找不到。有人可以指出我应该查看的地方吗?

我通过缩放输入解决了 TNC 抛出的 "unable to progress"。如果您遇到此问题,请在知道哪些变量有效地最小化 objective 函数的情况下形成一个比例向量。

假设 X1 比 X2 更有效,那么你的比例向量将为 [100,2]。 使用它来改变边界、输入数据和结果 (res.x)。