UA MATH575B 数值分析下II 牛顿算法
UA MATH575B 數(shù)值分析下II 牛頓算法
- Pure Newton算法
- Damped Newton算法
- Levenberg-Marquardt算法
- Quasi-Newton算法
- 割線法
- Broyden–Fletcher–Goldfarb–Shanno算法
- 示例
Pure Newton算法
考慮優(yōu)化問題
min?xf(x)\min_{x} f(x) xmin?f(x)
Pure Newton算法其實(shí)就是把Newton-Raphson算法用來接優(yōu)化的一階條件?f(x)=0\nabla f(x)=0?f(x)=0,遞推公式為
xk+1=xk?H?1f(xk)?f(xk)x_{k+1} = x_{k} - H^{-1}f(x_{k}) \nabla f(x_{k}) xk+1?=xk??H?1f(xk?)?f(xk?)
其中H?1H^{-1}H?1代表Hessian矩陣的逆。因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">?f(x)=0\nabla f(x)=0?f(x)=0的解不一定是全局最優(yōu)解,它還可能是局部最優(yōu)解或者鞍點(diǎn),這個(gè)是Pure Newton算法最大的問題。還有就是這個(gè)下降的步長完全是由H?1f(xk)?f(xk)H^{-1}f(x_{k}) \nabla f(x_{k})H?1f(xk?)?f(xk?)計(jì)算決定的,沒有控制步長的操作,可能導(dǎo)致下降路徑步與步之間變動(dòng)非常大。下面兩種算法是針對這個(gè)缺點(diǎn)的改進(jìn)。
Damped Newton算法
阻尼牛頓算法在牛頓算法的基礎(chǔ)上給步長加了一個(gè)阻尼因子ttt
xk+1=xk?tH?1f(xk)?f(xk)=xk+tΔxkx_{k+1} = x_{k} - tH^{-1}f(x_{k}) \nabla f(x_{k}) = x_{k} + t \Delta x_{k} xk+1?=xk??tH?1f(xk?)?f(xk?)=xk?+tΔxk?
在寫算法的時(shí)候這個(gè)ttt用線性回溯搜索來找
t=arg?min?t≥0f(xk+tΔxk)t = \argmin_{t \ge 0} f(x_k + t \Delta x_k) t=t≥0argmin?f(xk?+tΔxk?)
具體實(shí)現(xiàn)的時(shí)候可以先給定一個(gè)不算小的初值,逐漸減少直到
f(xk+tΔxk)<f(xk)+α?f(xk)?tΔxkf(x_{k} + t \Delta x_{k}) < f(x_{k}) + \alpha \nabla f(x_{k}) \cdot t \Delta x_{k} f(xk?+tΔxk?)<f(xk?)+α?f(xk?)?tΔxk?
α\alphaα在[0,1)上取值,其意義在于當(dāng)下降方向比較合適的時(shí)候,允許這一步多下降一點(diǎn)。
Levenberg-Marquardt算法
Levenberg-Marquardt算法在阻尼牛頓算法的基礎(chǔ)上又給Hessian矩陣加了一個(gè)松弛項(xiàng)
xk+1=xk?t(Hf(xk)+μI)?1?f(xk)x_{k+1} = x_{k} - t(Hf(x_{k})+\mu I)^{-1} \nabla f(x_{k}) xk+1?=xk??t(Hf(xk?)+μI)?1?f(xk?)
當(dāng)μ\muμ等于0時(shí),這個(gè)算法變回阻尼牛頓算法,當(dāng)μ\muμ趨近于無窮時(shí),這個(gè)算法就成了梯度下降。
Quasi-Newton算法
割線法
相信大家都有這個(gè)感覺,牛頓算法要寫代碼就要算兩階偏導(dǎo),簡單的Matlab算一算就好,復(fù)雜一點(diǎn)的Matlab算出來可能是錯(cuò)的也可能算不出來,手算也會(huì)很麻煩。考慮一元函數(shù),割線法就可以避免繁瑣的求導(dǎo),用差商代替求導(dǎo),幾何上就相當(dāng)于割線代替切線,所以叫割線法。它的遞推公式長這樣,假設(shè)g=f′g=f'g=f′
xk+1=xk?g(xk)g′(xk)x_{k+1} = x_{k} - \frac{g(x_{k})}{g'(x_{k})} xk+1?=xk??g′(xk?)g(xk?)?
割線法有兩個(gè)問題,收斂比較慢以及只能處理一元函數(shù)的優(yōu)化。BFGS算法把割線法的思想推廣到多元,即想辦法用數(shù)值計(jì)算步驟替換求導(dǎo),盡管無法解決收斂比牛頓算法慢的缺陷,但至少避免了多元函數(shù)求導(dǎo)的計(jì)算。
Broyden–Fletcher–Goldfarb–Shanno算法
BFGS算法的核心是在更新x的同時(shí)也更新Hessian矩陣的逆,從而避免求導(dǎo)和求逆的操作。這里給一個(gè)BFGS算法的簡單推導(dǎo)。用Δxk\Delta x_{k}Δxk?表示第kkk步的步長,C^k\hat{C}_{k}C^k?表示第kkk步對H?1f(xk)H^{-1}f(x_{k})H?1f(xk?)的近似,則
Δxk=?H?1f(xk)?f(xk)≈?C^k?f(xk)\Delta x_{k} = -H^{-1}f(x_{k}) \nabla f(x_{k}) \approx -\hat{C}_{k}\nabla f(x_{k}) Δxk?=?H?1f(xk?)?f(xk?)≈?C^k??f(xk?)
類似阻尼牛頓法,給步長加個(gè)阻尼ttt,定義dk=tΔxkd_k = t\Delta x_{k}dk?=tΔxk?,阻尼因子同樣由線性回溯搜索確定。遞推方程為
xk+1=xk+dkx_{k+1} = x_{k} + d_{k} xk+1?=xk?+dk?
現(xiàn)在推導(dǎo)C^k\hat{C}_{k}C^k?的遞推方程。先定義梯度的差分
gk=?f(xk+1)??f(xk)g_k = \nabla f(x_{k+1}) - \nabla f(x_{k}) gk?=?f(xk+1?)??f(xk?)
考慮梯度的Taylor展開
?f(xk+1)??f(xk)≈Hf(xk)(xk+1?xk)C^k+1gk≈dk\nabla f(x_{k+1}) - \nabla f(x_{k}) \approx Hf(x_{k}) (x_{k+1}-x_{k}) \\ \hat{C}_{k+1} g_k \approx d_k ?f(xk+1?)??f(xk?)≈Hf(xk?)(xk+1??xk?)C^k+1?gk?≈dk?
老師上課推了,但我覺得好像有點(diǎn)簡單以為我會(huì)的,結(jié)果現(xiàn)在寫博客發(fā)現(xiàn)我錯(cuò)了,我不會(huì),先空在這兒吧,等我會(huì)了再補(bǔ)上。
示例
最小化函數(shù)
H2(x,y)=exp?(8x?13y+21)+exp?(21y?13x+34)+0.0001exp?(x+y)H_2 (x,y)=exp?(8x-13y+21)+exp?(21y-13x+34)+0.0001exp?(x+y) H2?(x,y)=exp?(8x?13y+21)+exp?(21y?13x+34)+0.0001exp?(x+y)
這個(gè)函數(shù)的性質(zhì)非常詭異,看個(gè)示意圖就知道了,它遞增非常快,數(shù)值非常大,如果畫圖的(x,y)區(qū)域設(shè)置得再大一點(diǎn)看到的就是一個(gè)平面加一個(gè)非常尖的峰。
這個(gè)函數(shù)是個(gè)凸函數(shù),最小值存在。先用最簡單的牛頓法試試看怎么樣。先定義這個(gè)函數(shù),
然后定義函數(shù)計(jì)算牛頓法每一步更新的位移,
function xstep = PureNewtonStep(xx,yy) global M1 M2 M3; H = M1*exp(8*xx-13*yy+21)+M2*exp(21*yy-13*xx+34)+M3*exp(xx+yy); N1 = 8*exp(8*xx-13*yy+21)-13*exp(21*yy-13*xx+34)+0.0001*exp(xx+yy); N2 = -13*exp(8*xx-13*yy+21)+21*exp(21*yy-13*xx+34)+0.0001*exp(xx+yy); xstep = H\[N1;N2]; end接下來寫一下牛頓法的迭代過程,設(shè)置更新的位移范數(shù)小于1e-8時(shí)停止,初值取(0,0),記錄下每一步更新之后的位置和迭代次數(shù)
K = 0; % # of iterations TOL = 1e-8; % stop criteria xstep = 1; % descent step x_pureNewton = [0;0]; while norm(xstep) > TOLxstep = PureNewtonStep(x_pureNewton(1,end),x_pureNewton(2,end));x1 = x_pureNewton(:,end) - xstep;x_pureNewton = [x_pureNewton x1];K = K + 1; end運(yùn)行結(jié)果顯示需要迭代30次,最小值為2.116459796742611e+11,此時(shí)的位置是(19.571447286191784, 11.691722203621611)。(x, y)的路徑可以畫出來看看
下降的軌跡畫出來也很詭異,從原點(diǎn)出發(fā)以后直奔東北,拐個(gè)急彎之后又掉頭向西南移動(dòng)。但事實(shí)上這是對的,因?yàn)檫@個(gè)函數(shù)最小值的通道比較狹窄(事實(shí)上這個(gè)最小值是局部最小,并不是全局最小值,要找到全局最小值需要更換不同初值調(diào)試)。再用BFGS來驗(yàn)證一下這個(gè)結(jié)果,另外兩個(gè)算法我這次寫作業(yè)沒用上,有機(jī)會(huì)再試試吧。
BFGS算出來最小值點(diǎn)是(19.571447252082269, 11.691722181991503) ,最優(yōu)的x與牛頓法前9個(gè)數(shù)字相同,最優(yōu)的y與牛頓法前8個(gè)數(shù)字相同,基本是符合設(shè)定的容許誤差的。
總結(jié)
以上是生活随笔為你收集整理的UA MATH575B 数值分析下II 牛顿算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UA MATH575B 数值分析下III
- 下一篇: UA MATH574M 统计学习II 二