3

我有大量方程(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,因此这是不可能的?

4

1 回答 1

1

Levenberg-Marquardt 算法可以解决您的问题;但是,我没有在 C# 中找到实现这种情况的实现[更新:有关如何让 alglib.net 执行您想要的操作的详细信息,请参阅下面的编辑]。对于这种情况,MINPACK 确实有入口点(LMDIF1 或 LMDIF,如果如您所说,您希望使用差异来近似导数)。您可以尝试使用StackOverflow 上一个问题中列出的工具自动翻译C/C++ 版本的MINPACK

至于您在“编辑 2”中的问题:“这是否意味着如果我的参数多于函数,则 LM 不起作用?”,答案是:不,你错了。在您的情况下,论文中的“m”实际上等于您拥有的方程数乘以您拥有的数据点数(假设您所说的“观察值”是差异的值在每个方程的右侧和左侧之间)。换句话说,他在那里谈到的 r-sub-i 函数正是那些方程差异(RHS - LHS)。

重要编辑:现在我看到您找到的第二个包 alglib.net执行您想要的操作(但请注意,它仅在 GPL 下免费提供)。由于您不想提供导数,因此您应该使用“V”方案,其中,假设您有 n 个方程和 k 个参数的观察值,f 向量具有 n*k 个元素,其中

f[i + j*n] = (RHS_of_equation[i](data_point[j]) - LHS_of_equation[i](data_point[j]))

(当然,i 和 j 从 0 开始)。

于 2012-02-11T21:36:04.500 回答