首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Eigen的Levenberg-Marquardt确定参数边界

使用Eigen的Levenberg-Marquardt确定参数边界
EN

Stack Overflow用户
提问于 2021-05-28 15:15:09
回答 1查看 89关注 0票数 0

我正在使用Eigen的Levenberg-Marquardt实现,并想知道如何为应该优化的参数设置一些边界。

当我将一些GNU octave程序迁移到Eigen时,我预计可能会有一些边界,这些边界可以很容易地作为参数提供给模块。

我的实现的布局几乎与this example中的布局相同。我不提供df()实现,而是使用Eigen::NumericalDiff来近似它。

那么,我如何在提供给minimize()的参数上强制一些边界呢?我想过在离开我的预期范围时,将操作符()中的误差(Fvec)设置为一些较高的值,但在一些小型测试中,这导致了奇怪的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-04 16:42:28

我找到了一个解决方案,至少对我来说是有效的。

这个想法是,一旦参数离开其正常边界,就增加误差向量。

这可以通过以下函数来实现:

代码语言:javascript
复制
penalize(x1, x2) = 1 + (exp(x1-x1max)*b1) + exp((x1min-x1)*b1) + exp((x2-x2max)*b2) + exp((x2min-x2)*b2)

b1/b2/...必须根据边界进行拾取。在我的例子中,我开始使用b1=0.1,范围是1600...3200。该函数可以很容易地扩展到所使用的参数数量。

像这样使用函数:

代码语言:javascript
复制
int operator(x, fvec) const
{
    fvec(i) = ... * penalize(x(1), x(2))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67734419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档