17

我正在寻找一个 C 语言库,它将优化目标函数(最好是 Levenberg-Marquardt 算法),并将支持框约束、线性不等式约束和非线性不等式约束。

我已经尝试了几个库,但它们都没有为我的应用程序使用必要的约束类型:

  • GNU GSL(根本不支持约束)
  • cMPFIT(仅支持框约束)
  • levmar(根本不支持非线性约束)

我目前正在探索NLopt,但我不确定是否可以使用提供的任何算法实现最小二乘法。

我很难相信在这个问题中没有一个库支持所有约束,所以我想我在谷歌搜索时犯了一个错误。

我最近发现我可以从 C 调用 Matlab 函数。虽然这很容易解决问题,但我不想从 C 调用 Matlab 函数。根据我的经验,这并不快。

任何帮助将不胜感激。

4

4 回答 4

7

前段时间我正在研究 C/C++ 最小二乘拟合库的状态。我记下了一些链接,包括您提供的链接以及:

  • ALGLIB/优化——具有边界约束的 Lev-Mar。

  • WNLIB /wnnlp - C 中的一个受约束的非线性优化包(一般优化,不是最小二乘)。通过添加惩罚函数来处理约束。

我还没有使用任何库,但 NLopt 对我来说似乎是最有前途的。如果它有专门的接口和算法用于(加权)最小二乘拟合,那就太好了。

顺便说一句,您对 Matlab 的注释是否意味着它具有具有非线性约束的 Lev-Mar?

于 2011-06-19T22:57:33.027 回答
5

我最终遵循的方法如下:

  • 我使用NLopt进行优化,并构造了目标函数来计算问题的平方误差

  • 显示出最有希望结果的算法是COBYLA(无局部导数优化)。它支持框约束和非线性约束。线性不等式约束被引入为非线性约束,这应该是普遍可行的。

简单的基准测试表明,它的收敛速度确实比 Lev-Mar 方法慢一些,但由于需要约束而牺牲了速度。

于 2011-06-22T11:01:31.057 回答
5

MPFIT:C语言中的MINPACK-1最小二乘拟合库

MPFIT 使用 Levenberg-Marquardt 技术来解决最小二乘问题。在其典型用途中,MPFIT 将用于通过调整一组参数来将用户提供的函数(“模型”)与用户提供的数据点(“数据”)相匹配。MPFIT 基于More' 和合作者的MINPACK-1 (LMDIF.F)。

http://cow.physics.wisc.edu/~craigm/idl/cmpfit.html

于 2012-03-29T12:00:18.537 回答
0

OPTIF9可以转换为 C(来自 Fortran)并且可能已经被某人转换为 C。

如果您所说的框约束的意思是它支持参数值的上限和下限,我相信有一个版本可以做到这一点。

这是一个棘手的问题,因为这意味着每当参数到达边界时,它都会有效地将自由度降低 1。当您不希望它时,它可能会“卡在墙上”。

我们发现最好使用不受约束的最小化器和变换参数,通过对数或 logit 变换之类的方法,这样在搜索空间中它们是不受约束的,但在模型空间中它们是受约束的。

至于其他类型的约束,我不知道,尽管作为目标函数的一部分,一个选项是在违反约束时使其变得非常糟糕,因此优化器会避开这些区域。

我发现当我有一组非常灵活的约束时,如果我想要一个好的无故障算法,我会使用Metropolis-Hastings。除非我错了,如果它生成了违反约束的样本,您可以简单地丢弃该样本。这需要更长的时间,但它很简单并且总是有效的。

于 2011-06-20T01:41:01.573 回答