问题标签 [levenberg-marquardt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4405 浏览

optimization - Levenberg-Marquardt 算法的局限性

我正在使用Levenberg-Marquardt 算法来最小化 6 个参数的非线性函数。每次最小化我都有大约 50 个数据点,但我没有得到足够准确的结果。我的参数彼此相差几个数量级这一事实是否如此重要?如果是,我应该在哪里寻找解决方案?如果没有,您在工作中遇到了什么样的 LMA 限制(这可能有助于发现我的应用程序的其他问题)?非常感谢您的帮助。

编辑:我要解决的问题是确定最佳转换 T:

使 3D 点集适合 3D 线束。详细来说,我有一组 3D 点的坐标和相应的 3D 线的方程,它们应该通过这些点(在理想情况下)。LMA 最小化转换后的 3D 点到相应 3D 线的距离总和。变换函数如下:

希望这个解释会有所帮助......

编辑2:

下面粘贴了一些示例性数据。3D 线由中心点和方向矢量描述。所有线的中心点是 (0,0,0),每个向量的“uz”坐标等于 1。方向向量的“ux”坐标集:

方向向量的 'uy' 坐标集:

和 (xyzxyzxyz ...) 形式的 3D 点集:

这是一种具有非常小的旋转的“简单”建模数据。

0 投票
1 回答
1394 浏览

java - Java 中的 Levenberg–Marquardt (LMA) 实现(替换 Python scipy.optimise.leastsq)

请问有人可以建议用Java很好地实现Levenberg-Marquardt算法吗?我更喜欢完整性和准确性而不是性能。

谢谢。

0 投票
3 回答
4561 浏览

algorithm - 在 C++ 中寻找优化算法来替换 Excel Solver

由于 Excel Solver 在数以千计的优化上运行起来非常慢(原因是它使用电子表格作为界面),我试图在 C++ 中实现一个类似的(特定于问题的)求解器(使用 Visual Studio 2010,在 Win 7 64 位平台)。我将通过 VBA 中的 Declare 语句包含 DLL,并且已经有这样做的经验,所以这不是问题。

我的问题是最小化经验数据与非线性但平滑的目标函数之间的平方误差之和,问题将包括非负性(X>=0)甚至正性约束(例如 X>=0.00000001) , X 表示决策变量。

我正在寻找一个健壮的、经过验证的实现。它可能是已建立图书馆的一部分。例如,我已经查看了 ALGLIB 存储的内容(请参阅http://www.alglib.net/optimization/),似乎他们的算法中只有一种接受有界约束。但是我不知道它的价值,这就是为什么我试图收集一些意见。

或者,另一方面,是否建议使用此类基本约束来增强 ALGLIB 的 Levenberg-Marquardt 算法,例如通过拒绝每个不满足我的约束的中间解决方案?(猜猜不会这样做,但仍然值得一问)

0 投票
4 回答
17345 浏览

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

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

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

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

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

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

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

任何帮助将不胜感激。

0 投票
3 回答
14488 浏览

c# - Levenberg-Marquardt 算法的 C# 实现

我正在寻找用于非线性最小二乘拟合的Levenberg–Marquardt 算法的 C# 实现。

0 投票
1 回答
1340 浏览

c# - 同时优化一组非线性方程中的参数

我有大量方程(n)和大量未知数(m),其中 m 大于 n。我正在尝试使用 n 个方程和大量观察值来找到 m 的值。

我已经查看了 C# 中 Levenberg-Marquardt 的一些实现,但我找不到任何可以解决超过 1 个方程的方法。例如,我查看了http://kniaz.net/software/LMA.aspx,这似乎是我想要的,除了它只需要一个方程作为参数,我想在同时。同样,这个包:http ://www.alglib.net/包含一个很好的 LM 实现,但仅适用于单个方程。

我想知道 C# 中是否有任何好的实现,或者我可以与我的 C# 代码一起使用可以做到这一点?尝试计算我的方程的一阶微分也将是昂贵的,所以我希望能够使用小的有限差分来近似它们。

此外,是否有任何关于 LM 如何工作以及如何实现它的好且易于理解的解释?我曾尝试阅读一些数学教科书以自己实现它,但我对数学一无所知,所以大部分解释都在我身上丢失了。

编辑:

我的问题的更多细节:

1)方程是动态形成的,可以随着我的问题的每次运行而变化

2)我对起始参数没有很好的猜测。我计划使用随机启动参数多次运行它,以找到全局最小值。

编辑2:

还有一个问题,我正在阅读这篇论文:http ://ananth.in/docs/lmtut.pdf ,我在第 2 部分看到了以下内容:

x = (x1; x2 ... xn) 是一个向量,每个 rj 是一个从 ℜn 到 ℜ 的函数。rj 称为残差,假设 m >= n。

这是否意味着如果我的参数多于函数,则 LM 不起作用?例如,如果我想为函数求解 A 和 B:

Y = AX + B

由于我的参数向量的大小为 2(A 和 B)并且我的函数计数为 1,因此这是不可能的?

0 投票
1 回答
320 浏览

math - 如何处理来自运动优化/捆绑调整的结构中的缺失数据

我正在研究来自运动应用程序的结构,并且我正在跟踪放置在对象上的许多标记以确定对象的刚性结构。

该应用程序本质上是在多个相机视图上使用标准的 Levenberg-Marquardt 优化,并最大限度地减少预期标记点与从每个视图以 2D 获得的标记点之间的差异。

对于每个标记点和每个视图,以下功能被最小化:

其中计算出的 XY 值取决于需要通过优化找到的许多未知参数,observedXY 是 2D 中的标记点位置。总的来说,我有(标记点 * 视图)我希望最小化的上述功能的数量。

我已经编写了一个摄像机的模拟代码,可以看到所有标记点,但我想知道如何处理在运行过程中由于光照、遮挡或不在摄像机视图中而导致点不可见的情况。在应用程序的实际运行中,我将使用网络摄像头查看对象,因此很可能并非所有标记都会立即可见,并且取决于我的计算机视觉算法的稳健程度,我可能无法检测到一直标记。

我想在无法观察到标记点的情况下将 diff 值设置为 0(sigma 平方差 = 0),但是这会扭曲结果吗?

我注意到的另一件事是,当呈现太多视图时,算法并没有那么好。当视图太多时,更有可能估计一个糟糕的解决方案。这是捆绑调整的一个常见问题,因为当呈现太多视图时会增加达到局部最小值的可能性?

0 投票
3 回答
3731 浏览

matlab - Levenberg-Marquardt 优化

任何人都知道我在哪里可以找到一个 .m (matlab) 文件,其中 Levenberg-Marquardt 修改了牛顿的方法来优化函数?

谢谢

0 投票
2 回答
481 浏览

c++ - C++ 数学:拟合复杂的函数不起作用

10 多天以来,我一直在努力让这个拟合操作正常工作。我使用 Levenberg-Marquardt 算法编写了一个用于拟合的 C++ 类,并用简单的多项式对其进行了测试,拟合成功;但是对于我的实验所需的真正的实验功能,它不起作用。

我在 Mathematica 上安装了相同的功能,在那里执行它是可以的(但速度很慢,每次拟合 12 秒,这就是我使用 C++ 的原因)。当我适应时,我的程序表现得很疯狂并返回错误的结果。您能否检查我使用的功能并告诉我是否有问题?

以下是我在课堂上使用的拟合过程。再一次,我想提一下它适用于多项式,所以我可能在这里犯了一个非常严重的错误,它只与一些特殊函数冲突......这是我的假设。


我使用的初始值非常接近正确值。

如果您需要任何其他信息,请告诉我。非常感谢任何帮助。

0 投票
2 回答
2404 浏览

python - Python:Levenberg Marquardt 算法并行化

我有一些代码适合实验数据的理论预测,我想运行 LMA(Levenberg-Marquardt 算法)来适合实验的理论。然而,计算并不简单,每个模型在单个处理器上计算大约需要 10-30 分钟,但是问题是令人尴尬的可并行化,并且代码当前设置为将不同的组件(单个迭代)提交给集群计算机(此计算仍需要约 1-2 分钟)。

现在这个提交脚本是在 python 中的一个可调用函数中设置的 - 所以对于使用 scipy LMA (scipy.optimise.leastsq) 设置它是相对微不足道的 - 但是我想 scipy LMA 将通过每个单独的计算(对于测量梯度)串行,并等待返回,而我更希望 LMA 一次发送一整套计算,然后等待返回。python提交脚本看起来有点像:

其中“value_parameters”是维度 [number_iterations][number_parameters] 的嵌套列表,其中包含要为每个模型计算的变量,“number_parameters”是要拟合的参数数量,“number_iterations”是数量要计算的模型的数量(因此,为了测量梯度,LMA 计算 2*number_parameters 模型的每一步),并且“fitness_parameter”是必须最小化的值(并且具有维度 [迭代])。

现在,显然,我可以编写自己的 LMA,但这有点重新发明轮子 - 我想知道是否有任何东西可以满足我的需求(或者是否可以以这种方式使用 scipy LMA)。

高斯-牛顿算法也应该起作用,因为起点应该在最小值附近。约束拟合的能力(即为拟合参数设置最大值和最小值)会很好,但不是必需的。