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 是從012n 到function的函數。 rj被稱爲 作爲殘差,並假定m> = n。

這是否意味着如果我有比函數更多的參數,LM不起作用?例如,如果我要解決A和B的功能:

Y = AX + B

它不會由於這樣的事實,我的參數矢量的大小爲2(A和B的可能)和我的函數計數是1?

+0

在這裏後期,但研究同樣的事情,我碰到[this](http://www.trentfguidry.net/post/2011/12/10/Implementing-Levenberg-Marquardt-algorithm-nonlinear-least-squares - 迴歸 - 多重加權同時功能在C - sharp.aspx)最近,只是代碼在一些人博客雖然,所以沒有保證... – Benjol 2012-05-29 12:00:51

回答

1

Levenberg-Marquardt算法可以處理您的問題;然而,我沒有在C#中找到實現該實例的實現[更新:請參閱下面的編輯,以獲取alglib.net做你想做的事情的詳細信息]。 MINPACK在這種情況下具有入口點(LMDIF1或LMDIF,如果如您所述,您希望使用差異來近似導數)。您可以嘗試使用列於a previous question on StackOverflow的工具自動翻譯C/C++ version of 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])) 

(當然,我和j從0開始)。

+0

感謝您的答覆,我不太確定alglib在哪裏。然而,淨V功能。我只能找到F,FG和FGH選項,用於觀察點的非線性擬合。 http://www.alglib.net/interpolation/leastsquares.php#header20,我在看錯功能嗎? – Jkh2 2012-02-12 02:01:40

+0

查看URL http://www.alglib.net/translator/man/manual.csharp.html#example_minlm_d_v上的示例代碼...但更改function1_fvec以匹配我的解釋。 – 2012-02-12 02:11:49

+0

好啊,我想我現在明白了。只是爲了確定,如果我有我的一個方程y = 2x + c,其中y是我的觀察點,x是已知值,c是未知。這將是f [0] = 2x + c - y?感謝所有你的幫助迄今順便說一句,其無價:) – Jkh2 2012-02-12 02:22:45