C的非线性最小二乘优化库

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

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

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

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

我发现很难相信没有一个库可以支持这个问题的全部限制,所以我猜我在google搜索时出错了。

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

任何帮助将不胜感激。

前段时间我正在研究C / C ++最小二乘拟合库的状态。 我记下了一些链接,包括你给出的链接,还有:

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

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

我还没有使用任何库,但NLopt对我来说似乎最有希望。 如果它具有(加权)最小二乘拟合的专用接口和算法将是很好的。

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

我最终遵循的方法如下:

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

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

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

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

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

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

OPTIF9可以转换为C(来自Fortran),可能已经被某人所有。

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

这是一个棘手的问题,因为它意味着只要参数到达边界,它就会有效地将自由度降低1.当你真的不想要它时,它会“卡在墙上”。

我们发现最好使用无约束最小化器和变换参数,通过诸如log或logit变换之类的东西,这样在搜索空间中它们不受约束,但在模型空间中它们受到约束。

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

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