日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

共轭梯度法粗浅理解

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 共轭梯度法粗浅理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

共軛梯度法的粗淺理解

  • 共軛梯度法
    • 最速下降法
    • 共軛方向法
    • 共軛格萊姆——施密特正交化
    • 共軛梯度法

共軛梯度法

共軛梯度法是一種迭代優化方法,用來解決Ax=bAx=bAx=b方程問題,要求AAA對稱正定。具體來說,先構造一個二次型f(x)=12xTAx?bTxf(x)=\frac{1}{2}x^TAx-b^Txf(x)=21?xTAx?bTx,利用f′(x)=Ax?bf'(x)=Ax-bf(x)=Ax?b的特點,將解方程問題轉化為求函數f(x)f(x)f(x)的最值問題,由于AAA對稱正定,所以最小值f(x?)f(x^*)f(x?)必然存在且唯一。

最速下降法

最速下降法以當前迭代位置的負梯度方向作為下一步迭代方向,使用線搜索確定最優步長,對于目前的迭代位置xix_ixi?,其負梯度方向為ri=b?Axir_i=b-Ax_iri?=b?Axi?,最速下降法是一種貪心算法,要求在每一步迭代中都走到最小值點。
設朝rir_iri?方向走的步長為αiα_iαi?,我們要求f(xi+1)=f(xi+αiri)f(x_{i+1})=f(x_i+α_ir_i)f(xi+1?)=f(xi?+αi?ri?)最小,這里的唯一變量是αiα_iαi?,所以這是一個求駐點的問題:?f?αi=?f?xi+1?xi+1?αi=?f?xi+1ri=ri+1Tri=0\frac{\partial f} {\partial α_i}=\frac{\partial f} {\partial x_{i+1}}\frac{\partial x_{i+1}} {\partial α_i}= \frac{\partial f} {\partial x_{i+1}}r_i=r^T_{i+1}r_i=0?αi??f?=?xi+1??f??αi??xi+1??=?xi+1??f?ri?=ri+1T?ri?=0這個式子說明本次迭代的方向與下一次迭代的負梯度方向是正交的,注意這里與rir_iri?無關,只要使用線搜索,無論朝什么方向,這個方向都與xi+1x_{i+1}xi+1?的負梯度方向正交,這是最速下降法的一個特點。
然后來求步長αiα_iαi?:ri+1Tri=(b?Axi+1)Tri=[b?A(xi+αiri)]Tri=(ri?αiAri)Tri=0\begin{aligned}r^T_{i+1}r_i=&(b-Ax_{i+1})^Tr_i\\=&[b-A(x_i+α_ir_i)]^Tr_i\\=&(r_i-α_iAr_i)^Tr_i\\=&0\end{aligned}ri+1T?ri?====?(b?Axi+1?)Tri?[b?A(xi?+αi?ri?)]Tri?(ri??αi?Ari?)Tri?0? αi=riTririTAriα_i=\frac{r^T_ir_i}{r^T_iAr_i}αi?=riT?Ari?riT?ri??步長求出之后,給定一個初始點x0x_0x0?,根據求方向——求步長——更新xix_ixi?直到rir_iri?為0或小于某一閾值停止。

共軛方向法

由于最速下降法的特點,相鄰的兩次迭代方向是相互正交的,即迭代路徑經常會呈現ZZZ字形,自然可以想到在每個維度上的坐標值可能會來回晃動,可以看做由于貪心算法,下一次迭代可能會把上一次迭代所做出的貢獻給抹消一部分。共軛方向法有這樣的特點,每次迭代都會在這個方向走到極致,使這個方向沒有再優化的可能了,而之后的迭代不會對這個方向帶來影響,所以在RnR^nRn空間中,共軛方向法最多只需要nnn次迭代就可以找到最優值x?x^*x?

選擇一個初始點x0x_0x0?,這點到最優點x?x^*x?的誤差e0=x??x0e_0=x^*-x_0e0?=x??x0?,誤差既然是RnR^nRn空間中的向量,它就可以寫成nnnnnn維線性無關向量d0......dn?1d_0......d_{n-1}d0?......dn?1?的加權和:e0=∑i=0n?1δidie_0=\sum_{i=0}^{n-1}δ_id_ie0?=i=0n?1?δi?di?可以看出,沿著d0......dn?1d_0......d_{n-1}d0?......dn?1?分別走δ0......δn?1δ_0......δ_{n-1}δ0?......δn?1?就可以找到最優值,找到nnn個線性無關的向量不難,關鍵在于找到后如何計算每個方向的步長,顯然方向的選取也很講究,必須容易計算步長。

在最速下降法中,使用線搜索可以很方便地找到方向和步長,假設第iii次迭代方向是did_idi?,那么下一次的迭代方向di+1=ri+1d_{i+1}=r_{i+1}di+1?=ri+1?diTri+1=0d_i^Tr_{i+1}=0diT?ri+1?=0誤差與負梯度之間的關系是:ri=Aeir_i=Ae_iri?=Aei?代入得到:diTAei=0d_i^TAe_i=0diT?Aei?=0 diTA∑k=in?1δkdk=0d_i^TA\sum_{k=i}^{n-1}δ_kd_k=0diT?Ak=in?1?δk?dk?=0所以我們給這些方向ddd加的條件是A?A-A?正交,也叫共軛:diTAdj=0d_i^TAd_j=0diT?Adj?=0滿足這個條件的一組方向就可以用線搜索的方式確定步長,驗證一下:

e0=∑i=0n?1δidie_0=\sum_{i=0}^{n-1}δ_id_ie0?=i=0n?1?δi?di?兩邊左乘djTAd_j^TAdjT?A:djTAe0=∑i=0n?1δidjTAdid_j^TAe_0=\sum_{i=0}^{n-1}δ_id_j^TAd_idjT?Ae0?=i=0n?1?δi?djT?Adi? djTAe0=δjdjTAdjd_j^TAe_0=δ_jd_j^TAd_jdjT?Ae0?=δj?djT?Adj? δj=djTAe0djTAdjδ_j=\frac{d_j^TAe_0}{d_j^TAd_j}δj?=djT?Adj?djT?Ae0?? δj=djTrjdjTAdjδ_j=\frac{d_j^Tr_j}{d_j^TAd_j}δj?=djT?Adj?djT?rj??正好與上面線搜索的步長公式吻合,表示這么做可行。

上面的推導說明了一組滿足兩兩共軛的向量組可以用線搜索來確定步長,接下來就是如何找到一組兩兩共軛的向量組的問題。

共軛格萊姆——施密特正交化

這里就不詳細寫了,線性代數中的格萊姆——施密特正交化過程是由一組線性無關的向量組u1......unu_1......u_nu1?......un?得到一組兩兩正交的向量組d1......dnd_1......d_nd1?......dn?的過程:d1=u1d_1=u_1d1?=u1? di=ui?∑j=1i?1(ui,dj)dj∣∣dj∣∣d_i=u_i-\sum_{j=1}^{i-1}(u_i,d_j)\frac{d_j}{||d_j||}di?=ui??j=1i?1?(ui?,dj?)dj?dj??共軛的版本只是把上式中的正交換成了A?A-A?正交,如此就可以用任一組線性無關的向量生成一組共軛向量進行求解:di=ui?∑j=1i?1uiTAdjdjTAdjdjd_i=u_i-\sum_{j=1}^{i-1}\frac{u_i^TAd_j}{d_j^TAd_j}d_jdi?=ui??j=1i?1?djT?Adj?uiT?Adj??dj?

共軛格萊姆——施密特正交化有計算復雜的缺點,計算did_idi?時需要計算之前所有的共軛向量d1......di?1d_1......d_{i-1}d1?......di?1?與矩陣A的乘法,一般很難進行,所以就有了共軛梯度法,注意這個名字并不是指梯度是共軛的,而是使用梯度信息來獲取共軛向量組的方法。

共軛梯度法

共軛梯度法的一組共軛向量指的是負梯度構造的共軛向量:di=ri?∑j=1i?1riTAdjdjTAdjdjd_i=r_i-\sum_{j=1}^{i-1}\frac{r_i^TAd_j}{d_j^TAd_j}d_jdi?=ri??j=1i?1?djT?Adj?riT?Adj??dj?βij=riTAdjdjTAdjβ_{ij}=\frac{r_i^TAd_j}{d_j^TAd_j}βij?=djT?Adj?riT?Adj??,這樣做的好處是每次構造共軛向量did_idi?時,只需要計算βi,i?1β_{i,i-1}βi,i?1?即可:rj+1=rj?αjAdjr_{j+1}=r_j-α_jAd_jrj+1?=rj??αj?Adj? 兩邊同時左乘rir_iri?:riTrj+1=riTrj?αjriTAdjr_i^Tr_{j+1}=r_i^Tr_j-α_jr_i^TAd_jriT?rj+1?=riT?rj??αj?riT?Adj? riTAdj=?1αjriTrj+1r_i^TAd_j=-\frac{1}{α_j}r_i^Tr_{j+1}riT?Adj?=?αj?1?riT?rj+1? 不難看出riTrj+1r_i^Tr_{j+1}riT?rj+1?只有在i=j+1i=j+1i=j+1時不為0,將上式帶入到βijβ_{ij}βij?中可以得到只有在j=i?1j=i-1j=i?1βij≠0β_{ij}\neq0βij??=0,因此只需要計算一輪矩陣向量乘法,減少了計算量。

總結

以上是生活随笔為你收集整理的共轭梯度法粗浅理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。