我正在寻找一个C语言库,它将对目标函数进行优化(最好是Levenberg-Marquardt算法),并支持框约束,线性不等式约束和非线性不等式约束。
我已经尝试了几个库,但是它们都没有为我的应用程序使用必要的约束类型:
我目前正在探索NLopt,但我不确定是否可以使用任何提供的算法实现最小二乘法。
我发现很难相信没有一个库可以支持这个问题的全部限制,所以我猜我在google搜索时出错了。
我最近发现我可以从C调用Matlab函数。虽然这样可以很容易地解决问题,但我不想从C调用Matlab函数。根据我的经验,这并不快。
非常感谢任何帮助。
答案 0 :(得分:6)
前段时间我正在研究C / C ++最小二乘拟合库的状态。我记下了一些链接,包括你给出的链接,还有:
ALGLIB/optimization - Lev-Mar有边界限制。
WNLIB / wnnlp - C中的约束非线性优化包(一般优化,非最小二乘)。通过添加惩罚函数来处理约束。
我还没有使用任何库,但NLopt对我来说似乎最有希望。如果它具有(加权)最小二乘拟合的专用接口和算法,那就太好了。
顺便说一下,关于Matlab的注释是否意味着它具有非线性约束的Lev-Mar?答案 1 :(得分:5)
我最终遵循的方法如下:
我使用NLopt进行优化,构建目标函数来计算问题的平方误差。
显示最有希望的结果的算法是 COBYLA (无局部导数优化)。它支持框约束和非线性约束。线性不等式约束是作为非线性约束引入的,这通常是可行的。
简单的基准测试表明它的收敛速度比Lev-Mar方法慢一点,但由于需要约束而牺牲了速度。
答案 2 :(得分:5)
MPFIT使用Levenberg-Marquardt技术解决最小二乘问题。在其典型用途中,MPFIT将用于通过调整一组参数将用户提供的功能(“模型”)拟合到用户提供的数据点(“数据”)。 MPFIT基于More'和合作者的MINPACK-1(LMDIF.F)。
答案 3 :(得分:0)
OPTIF9可以转换为C(来自Fortran)并且可能已经由某人使用过。
如果你对盒子约束的意思是它支持参数值的上限和下限,我相信有一个版本可以做到这一点。
这是一个棘手的问题,因为它意味着只要参数到达边界,它就会有效地将自由度降低1。 当你真的不想要它时,它可能会“卡在墙上”。
我们发现最好使用无约束最小化器和变换参数,通过诸如log或logit变换之类的东西,以便在搜索空间中它们不受约束,但在模型空间中它们受到约束。 / p>
就其他类型的约束而言,我不知道,尽管作为目标函数的一部分,一个选项是在违反约束时使其变得非常糟糕,因此优化器会避免这些区域。
我发现当我有一套非常灵活的约束时,如果我想要一个好的无故障算法,我会使用Metropolis-Hastings。 除非我错了,如果它生成违反约束的样本,你可以简单地丢弃样本。 它需要更长的时间,但它很简单并且始终有效。