我是一个程序,想要学习如何将文伯格–Marquardt curvefitting算法的工作这样我就可以实现它自己。是否有一个良好的教程的任何地方,可以解释它是如何工作的详细读者beeing一程序并不是一个mathemagician.

我的目标是要实现这个算法简单,所以,我可以运行它的硬件加速。

有帮助吗?

解决方案

其他提示

最小化的函数是像试图找到一个表面上的最低点。想想自己走在一个多山的表面和你试图让来的最低点。你会发现,进入下坡方向走,直到它不下山了。然后,你就选择了去下坡走在那个方向,直到它不会走下坡路了,所以这样的一个新的方向。最后,(希望),你会在没有方向顺心达到了一个点。然后,将在(本地)最小。

在LM算法,以及许多其他最小化算法,使用此方案。

假设被最小化的函数为F,我们在我们的迭代中的点x(n)的。我们希望找到下一个迭代X(N + 1),使得F(X(N + 1))

首先,在点x(n)的计算线性近似F。这是很容易找到一个线性函数的下坡方向,所以我们用线性逼近函数来确定下坡方向。 接下来,我们需要知道有多远,我们可以在此选择的方向走。如果我们的近似线性函数是适用于F一个很好的近似围绕x(n)的大面积的,那么我们可以采取一个相当大的一步。如果这是一个很好的近似只有非常接近X(N),那么我们可以只是一个很小的一步。

这是LM做什么 - 在X(N)来计算线性近似至F,从而使下坡方向,然后将其计算出的工序有多大来利用基于线性函数如何近似于F。对于X(N )。 LM计算出的近似函数如何好是由基本上取入由此所确定的方向上的步骤以及将所述线性近似到F多少降低到多少实际函数F下降。如果他们靠近,逼近函数是好的,我们可以采取一个更大一点的一步。如果他们不接近,则近似功能不好,我们应该后退,取较小的一步。

基本的想法的LM算法可以解释几页-但对于一个生产级实现快速和强大的,许多微妙的优化都是必要的。国家的技术仍然是Minpack执行Moré et al., 详细记录,由Moré1978年(http://link.springer.com/content/pdf/10.1007/BFb0067700.pdf)和在Minpack用户指南(http://www.mcs.anl.gov/~更多/ANL8074b.pdf).研究所的代码,我的翻译(https://jugit.fz-juelich.de/mlz/lmfit)是可能更容易,比原来Fortran代码。

尝试数字食谱(列文伯格 - 马夸尔特是在第15.5节)。它可在网上,我发现他们解释算法在真实详细的方式(他们有完整的源代码,你如何更详细的可以得到...),但访问。

我用这些笔记从在普渡大学课程以编码向上在MATLAB通用列文伯格 - 马夸尔特曲线拟合算法,其计算的数值的衍生物,因此接受的形式f(x;p)其中p是拟合参数的向量的任何功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top