机器学习: 共轭梯度算法(PCG)
今天介紹數值計算和優化方法中非常有效的一種數值解法,共軛梯度法。我們知道,在解大型線性方程組的時候,很少會有一步到位的精確解析解,一般都需要通過迭代來進行逼近,而 PCG 就是這樣一種迭代逼近算法。
我們先從一種特殊的線性方程組的定義開始,比如我們需要解如下的線性方程組:
Ax=bAx=b
這里的 A(n×n)A(n×n) 是對稱,正定矩陣, b(n×1)b(n×1) 同樣也是已知的列向量,我們需要通過 AA 和 bb 來求解 x(n×1)x(n×1), 這其實是我們熟知的一些線性系統的表達式。
直接求解
首先,我們來看一種直觀的解法,我們定義滿足如下關系的向量為關于 矩陣 AA 的共軛向量,
uTAv=0uTAv=0
因為矩陣 AA 是對稱正定矩陣,所以矩陣 AA 定義了一個內積空間:
?u,v?A:=?Au,v?=?u,ATv?=?u,Av?=uTAv?u,v?A:=?Au,v?=?u,ATv?=?u,Av?=uTAv
基于此,我們可以定義一組向量 PP
P={p1,…,pn}P={p1,…,pn}
其中的向量 p1p1 , p2p2, … , pnpn 都是互為共軛的,那么 PP 構成了 RnRn 空間的一個基,上述方程的解 x?x? 可以表示成 PP 中向量的線性組合:
x?=∑i=1nαipix?=∑i=1nαipi
根據上面的表達式,我們可以得到:
Ax?=∑i=1nαiApipTkAx?=∑i=1nαipTkApi(Multiply left by?pTk)pTkb=∑i=1nαi?pk,pi?A(Ax?=b?and??u,v?A=uTAv)?pk,b?=αk?pk,pk?A(uTv=?u,v??and??i≠k:?pk,pi?A=0)Ax?=∑i=1nαiApipkTAx?=∑i=1nαipkTApi(Multiply left by?pkT)pkTb=∑i=1nαi?pk,pi?A(Ax?=b?and??u,v?A=uTAv)?pk,b?=αk?pk,pk?A(uTv=?u,v??and??i≠k:?pk,pi?A=0)
這意味著:
αk=?pk,b??pk,pk?Aαk=?pk,b??pk,pk?A
所以,如果我們要直接求解的,可以先對矩陣 AA 進行特征值分解,求出一系列的共軛向量,然后求出系數,最后可以得到方程的解 x?x?
迭代求解
上面的方法已經說明,x?x? 是一系列共軛向量 pp 的線性組合,學過 PCA 的都知道,可以用前面占比高的向量組合進行逼近,而不需要把所有的向量都組合到一起,PCG 也是用到了這種思想,通過仔細的挑選共軛向量 pp 來重建方程的解 x?x?。
我們先來看下面的一個方程:
f(x)=12xTAx?xTb,x∈Rnf(x)=12xTAx?xTb,x∈Rn
對上面的方程求導,我們可以得到:
D2f(x)=AD2f(x)=A
Df(x)=Ax?bDf(x)=Ax?b
可以看到,方程的一階導數就是我們需要解的線性方程組,令一階導數為 0,那么我們需要解的就是這樣一個線性方程組了。
假設我們隨機定義 xx 的一個初始向量為 x0x0,那么我們可以定義第一個共軛向量為 p0=b?Ax0p0=b?Ax0, 后續的基向量都是和梯度共軛的,所以稱為共軛梯度法。
下面給出詳細的算法流程:
而 preconditioned conjugate gradient method 與共軛梯度法的不同之處在于預先定義了一個特殊矩陣 MM:
參考來源:wiki 百科
https://en.wikipedia.org/wiki/Conjugate_gradient_method#The_preconditioned_conjugate_gradient_method
轉載于:https://www.cnblogs.com/mtcnn/p/9412105.html
總結
以上是生活随笔為你收集整理的机器学习: 共轭梯度算法(PCG)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python模块安装(xgboost)
- 下一篇: 各种编码问题