首页 > 解决方案 > dlib::find_min_bobyqa 的参数

问题描述

我正在研究 Matt Zucker 的Page dewarping的 C++ 版本。到目前为止一切正常,但我在优化方面遇到了问题。在 Github repo的第 748 行, Matt 使用了 Scipy 的优化功能。我的 C++ 等效项是来自dlib.net的 find_min_bobyqa。代码是:

auto f = [&](const column_vector& ppts) { return objective( dstpoints, ppts, keypoint_index); };
dlib::find_min_bobyqa(f,
               params,
               2 * params.nr() + 1,    // npt - number of interpolation points: x.size() + 2 <= npt && npt <= (x.size()+1)*(x.size()+2)/2
               dlib::uniform_matrix<double>(params.nr(), 1, -2),  // lower bound constraint
               dlib::uniform_matrix<double>(params.nr(), 1, 2),   // upper bound constraint
               1,    // initial trust region radius
               1e-5,  // stopping trust region radius
               4000    // max number of objective function evaluations
);

在我的具体示例params中,adlib::column_vector具有 double 值且长度 = 189。params 的每个元素都小于 2.0 且大于 -2.0。函数objective()返回双精度值并且“单独”它可以正常工作,因为我得到的值与 Python 版本中的值相同。但在运行fin_min_bobyqa功能后,我通常会收到以下消息:

抛出 'dlib:bobyqa_failure' 的实例后调用终止,从 BOBYQA 返回,因为目标函数已被调用 max_f_evals 次。

我设置max_f_evals了一个相当大的值来查看它是否优化,但它没有。我对参数做了一些调整,但没有好的结果。我应该如何设置参数find_min_bobyqa以获得正确的解决方案?

标签: dlib

解决方案


我终于解决了这个问题。我使用了 PRAXIS库,因为它不需要衍生信息并且速度很快。我根据自己的需要稍微修改了代码,现在它比用 Python 编写的原始版本快了几秒钟。


推荐阅读