我有大量的方程(n),其中有大量的未知数(m),其中m大于n。我试图使用n个方程和一大组观察值来找到m的值。
我已经看过Levenberg-Marquardt在C#中的一些实现,但我找不到任何解决超过1个等式的方法。例如,我查看http://kniaz.net/software/LMA.aspx,它似乎是我想要的,除了它只需要一个方程作为参数,我想同时解决许多方程。类似地,这个包:http://www.alglib.net/包含LM的良好实现,但仅适用于单个等式。
我想知道C#中是否有任何好的实现,或者我可以使用可以执行此操作的C#代码?尝试计算我的方程的一阶微分也是代价高昂的,所以我希望能够使用小的有限差分来近似它们。
此外,有关LM如何工作以及如何实施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)
Levenberg-Marquardt算法可以解决您的问题;但是,我没有在C#中找到实现该案例的实现 [更新:请参阅下面的编辑,了解如何让alglib.net做你想做的事情] 。 MINPACK确实有针对该情况的入口点(LMDIF1或LMDIF,如果您声明,您希望使用差异来近似导数)。您可以尝试使用C/C++ version of MINPACK中列出的工具自动翻译a previous question on StackOverflow。
至于你的问题"编辑2":"这是否意味着如果我有更多的参数而不是函数LM不起作用?",答案是:不,你错了。 " M"在那篇文章中,实际上,在你的情况下,等于你拥有的方程数,乘以你拥有的数据点的数量(假设你的意思是"观察到的值& #34;是每个等式的右手侧和左手侧之间的差值。换句话说,他在那里谈到的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]))
(当然,我和j从0开始)。