LM演算法與非線性最小二乘問題

2021-09-30 12:25:16 字數 2372 閱讀 9926

摘錄的一篇有關求解非線性最小二乘問題的演算法--lm演算法的文章,當中也加入了一些我個人在求解高精度最小二乘問題時候的一些感觸:

lm演算法,全稱為levenberg-marquard演算法,它可用於解決非線性最小二乘問題,多用於曲線擬合等場合。

lm演算法的實現並不算難,它的關鍵是用模型函式 f 對待估引數向量p在其鄰域內做線性近似,忽略掉二階以上的導數項,從而轉化為線性最小二乘問題,它具有收斂速度快等優點。lm演算法屬於一種「信賴域法」——所謂的信賴域法,此處稍微解釋一下:在最優化演算法中,都是要求乙個函式的極小值,每一步迭代中,都要求目標函式值是下降的,而信賴域法,顧名思義,就是從初始點開始,先假設乙個可以信賴的最大位移s,然後在以當前點為中心,以s為半徑的區域內,通過尋找目標函式的乙個近似函式(二次的)的最優點,來求解得到真正的位移。在得到了位移之後,再計算目標函式值,如果其使目標函式值的下降滿足了一定條件,那麼就說明這個位移是可靠的,則繼續按此規則迭代計算下去;如果其不能使目標函式值的下降滿足一定的條件,則應減小信賴域的範圍,再重新求解。

事實上,你從所有可以找到的資料裡看到的lm演算法的說明,都可以找到類似於「如果目標函式值增大,則調整某係數再繼續求解;如果目標函式值減小,則調整某係數再繼續求解」的迭代過程,這種過程與上面所說的信賴域法是非常相似的,所以說lm演算法是一種信賴域法。

lm演算法需要對每乙個待估引數求偏導,所以,如果你的目標函式f非常複雜,或者待估引數相當地多,那麼可能不適合使用lm演算法,而可以選擇powell演算法——powell演算法不需要求導。

至於這個求導過程是如何實現的,我還不能給出建議,我使用過的方法是拿到函式的方程,然後手工計算出其偏導數方程,進而在函式中直接使用,這樣做是最直接,求導誤差也最小的方式。不過,在你不知道函式的形式之前,你當然就不能這樣做了——例如,你提供給了使用者在介面上輸入數學函式式的機會,然後在程式中解析其輸入的函式,再做後面的處理。在這種情況下,我猜是需要使用數值求導演算法的,但我沒有親自試驗過這樣做的效率,因為一些優秀的求導演算法——例如ridders

演算法——在一次求導數值過程中,需要計算的函式值次數也會達到5次以上。這樣的話,它當然要比手工求出導函式(只需計算一次,就可以得到導數值)效率要差得多了。不過,我個人估計(沒有任何依據的,只是猜的):依賴於lm演算法的高效,就算新增了乙個數值求導的「拖油瓶」,整個最優化過程下來,它仍然會優於powell等方法。

關於偏導數的求取

個人認為:在條件允許、對速度和精度任何以方面都有一定要求的前提下,如果待求解的函式形式是顯式的,應當盡量自己計算目標函式的偏導數方程。原因在於,在使用數值法估計偏導數值時,儘管我們可以控制每一步偏導數值的精度,但是由於求解過程需要進行多次迭代,特別是收斂過程比較慢的求解過程,需要進行很多次的求解,每一次求解的誤差偏差都會在上一步偏差的基礎上不斷累積。儘管在最後依然可以收斂,但是得到的解已經離可以接受的解偏離比較遠了。因此,在求解函式形式比較簡單、偏導數函式比較容易求取時,還是盡量手動計算偏導數,得到的結果誤差相對更小一些。

在這篇解釋信賴域演算法的文章中,我們已經知道了lm演算法的數學模型:

可以證明,此模型可以通過解方程組(gk+μi)s=−gk確定sk來表徵。

即:lm演算法要確定乙個μ≥0,使得gk+μi正定,並解線性方程組(gk+μi)sk=−gk求出sk。

下面來看看lm演算法的基本步驟:

·從初始點x0,μ0>0開始迭代

·到第k步時,計算xk和μk

·分解矩陣gk+μki,若不正定,令μk=4μk並重複到正定為止

·解線性方程組(gk+μki)sk=−gk求出sk並計算rk

·若rk<0.25,令μk+1=4μk;若rk>0.75,令μk+1=μk2;若0.25≤rk≤0.75,令μk+1=μk

·若rk≤0,說明函式值是向著上公升而非下降的趨勢變化了(與最優化的目標相反),這說明這一步走錯了,而且錯得「離譜」,此時,不應該走到下一點,而應「原地踏步」,即xk+1=xk,並且和上面rk<0.25的情況一樣對μk進行處理。反之,在rk>0的情況下,都可以走到下一點,即xk+1=xk+sk

·        迭代的終止條件:∥gk∥<ε,其中ε是乙個指定的小正數(大家可以想像一下二維平面上的尋優過程(函式影象類似於拋物線),當接近極小值點時,迭代點的梯度趨於0)

從上面的步驟可見,lm求解過程中需要用到求解線性方程組的演算法,一般我們使用高斯約當消元法

,因為它非常穩定——雖然它不是最快最好的演算法。

同時,上面的演算法步驟也包含對矩陣進行分解的子步驟。為什麼要先分解矩陣,再解線性方程組?貌似是這樣的(數學不好的人再次淚奔):不分解矩陣使之正定,就無法確定那個線性方程組是有解的。矩陣分解

有很多演算法,例如lu

分解等,這方面我沒有看。

加粗部分為個人感想,其餘部分為從網上摘錄的一些經驗總結,對工作起到了很好的啟發作用,感謝原作者的分享。

非線性最小二乘

非線性最小二乘問題是求解目標引數 的最優值的方法 1.要有待優化的引數x 2.要知道引數與估計值的函式關係 f x 3.要有觀測資料z 4.待優化引數的初值x0 5.待優化引數的範圍 可選 非線性最小二乘問題,可以轉化為非線性優化問題 解非線性最小二乘需要非線性優化演算法 非線性優化演算法最通用的方...

手寫非線性最小二乘

方法1 梯度下降法 include include include include include include include class descent method descent method descent method double a,double b,double c a a b ...

非線性最小二乘問題的高斯 牛頓演算法

非線性最小二乘問題的高斯 牛頓演算法 開始做這個東西還是因為學校裡的一次課程設計任務,找遍了全網好像也沒有特別好用的,於是就自己寫了乙個。僅供參考。首先,介紹下非線性最小二乘問題。非線性最小二乘是數值最優化領域最常見的乙個子問題。與一般的優化問題不同的是,非線性最小二乘的目標函式具有明確的物理意義 ...