scipy实现的共轭梯度法以及相关原理图解
首先整理下兩個概念:
Definition:given that u,v∈Rnu,v∈R^nu,v∈Rn,then uuu and vvv are said to be mutually orthogonal if(u,v)=uTv=0(u,v)=u^Tv=0(u,v)=uTv=0(where (u,vu,vu,v)is our notation for the scalar product)
Definition:given that u,v∈Rnu,v∈R^nu,v∈Rn,then uuu and vvv are said to be mutually conjugate with respect to a symmetric positive definite matrix AAA if uuu and AvAvAv are mutually orthogonal,i.e. uTAv=(u,Av)=0u^TAv=(u,Av)=0uTAv=(u,Av)=0
所以根據定義來看很容易理解共軛梯度下降,其實就是兩個向量之間插入了一個正定矩陣,然后依然以乘積為0作為判斷依據.
------------------------------------所謂的共軛梯度體現在βk\beta_kβk?上面---------------------------------------------------------------------
關于βk\beta_kβk?的證明來自[5],證明過程中體現了共軛的概念.
---------------共軛梯度法在論文中的表述形式------------------
-------------------------------------------------------------
上面的1964年版本的αk\alpha_kαk?(也就是本文的βk\beta_kβk?)的推導過程[5]:
算法偽代碼比較見[4]
---------------------------------------------------------------接下來是代碼------------------------------------------------------------------------------
接下來是代碼:
[2]中給出了具體代碼,但是呢…既然scipy里面已經有這個共軛梯度算法了,我們就不要自己手寫搗騰了吧,嘻嘻~
它們分別是:
scipy.optimize.fmin_cg函數
以及
scipy.sparse.linalg.cg函數
但是后者沒有給出具體的example,
我們還是使用前者吧,代碼如下:
-----------------------------------------------------------------------------------------
二次終結法 (quadratic temination)并不是說迭代兩次就結束,千萬不要弄錯.
另外有個很重要的資料[6],我最后沒看,但是寫得真的很詳細,以后有時間并且有需要的情況下,可以看下.
[1]Conjugate Directions
[2]共軛梯度法的python實現
[3]官方案例
[4]Fletcher-Reevers Conjugate Descent和Steepest Descent兩種算法偽代碼的區別
[5]最優化共軛梯度法
[6]《An Introduction to the Conjugate Gradient Method Without the Agonizing Pain》-Jonathan Richard Shewchuk
總結
以上是生活随笔為你收集整理的scipy实现的共轭梯度法以及相关原理图解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fletcher-Reevers Con
- 下一篇: 神经网络中的病态曲率-Pathologi