日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

UA MATH575B 数值分析下II 牛顿算法

發(fā)布時(shí)間:2025/4/14 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UA MATH575B 数值分析下II 牛顿算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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=t0argmin?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è)非常尖的峰。

figure(1); x=-.01:0.0005:0.01; % change region here y=-0.01:0.0005:0.01; [xx,yy]=meshgrid(x,y); zz=exp(8*xx-13*yy+21)+exp(21*yy-13*xx+34)+0.0001*exp(xx+yy); surf(xx,yy,zz); xlabel('x'); ylabel('y') zlabel('H_2(x,y)');


這個(gè)函數(shù)是個(gè)凸函數(shù),最小值存在。先用最簡單的牛頓法試試看怎么樣。先定義這個(gè)函數(shù),

function zz = H2(xx,yy) zz=exp(8*xx-13*yy+21)+exp(21*yy-13*xx+34)+0.0001*exp(xx+yy); end

然后定義函數(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ì)再試試吧。

function [x] = BFGS_H2(x) F = H2(x(1),x(2)); dF = Gradient_H2(x(1),x(2)); C = eye(length(x)); N = 0; while (norm(dF) > 1.e-12 && N < 32)d = -C*dF;while (H2(x(1)+d(1),x(2)+d(2)) >= F)d = d / 2.;if (norm(d) < eps)C = eye(length(x)); d = -dF;endendx = x + d; F = H2(x(1),x(2)); new_dF = Gradient_H2(x(1),x(2)); g = new_dF - dF; dF = new_dF;rho = 1. / (g'*d); mu = rho*(1. + rho*(g'*C*g));C = C - rho*(d*(g'*C) + (C*g)*d') + mu*d*d';N = N+1; end

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。