共轭梯度法(CG)详解

Posted 陆嵩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共轭梯度法(CG)详解相关的知识,希望对你有一定的参考价值。

共轭梯度法(CG)详解

文章目录


之前写过几个关于共轭梯度法的注记,譬如:

但事实上很多人反应,看得一头雾水,基于此,本篇文章旨在对于共轭梯度方法从优化的角度给一个干净的描述。

线性共轭梯度法

线性共轭梯度方法是 Hestenes 和 Stiefel 在 20 世纪 50 年代提出来的的一个迭代方法,用于求解正定系数矩阵的线性系统。
假定 A A A 是对称正定的矩阵,求解线性方程组
A x = b A x=b Ax=b
等价于求解如下凸优化问题:
min ⁡ ϕ ( x ) ≡ 1 2 x T A x − b T x \\min \\phi(x) \\equiv \\frac12 x^T A x-b^T x minϕ(x)21xTAxbTx
该问题的梯度便是原线性系统的残差,
∇ ϕ ( x ) = A x − b ≡ r ( x ) \\nabla \\phi(x)=A x-b \\equiv r(x) ϕ(x)=Axbr(x)
x = x k x=x_k x=xk 点, r k = A x k − b r_k=A x_k-b rk=Axkb

共轭方向

定义 对于非零向量集合 p 0 , p 1 , ⋯   , p t \\left\\p_0, p_1, \\cdots, p_t\\right\\ p0,p1,,pt 关于对称正定矩阵 A A A 是共轭的,若
p i T A p j = 0 ,  for all  i ≠ j . p_i^T A p_j=0, \\quad \\text for all i \\neq j . piTApj=0, for all i=j.

容易证明,共轭向量之间是线性独立的。

假设已经有了一组共轭向量,我们把未知量表示为它们的线性组合 x = ∑ i = 1 n α i p i x=\\sum_i=1^n \\alpha^i p_i x=i=1nαipi,我们希望能够寻找一组系数,去极小化
ϕ ( x ) = ∑ i = 1 n ( ( α i ) 2 2 p i T A p i − α i p i T b ) \\phi(x)=\\sum_i=1^n \\left(\\frac\\left(\\alpha^i\\right)^22 p_i^T A p_i-\\alpha^i p_i^T b\\right) ϕ(x)=i=1n(2(αi)2piTApiαipiTb)
求和中的每一项都是独立的,极小化之,那么我们就可以得到
α i = p i T b p i T A p i \\alpha^i=\\fracp_i^T bp_i^T A p_i αi=piTApipiTb

通过共轭方向,把一个 n 维问题,拆解成了 n 个一维问题。

从矩阵的角度来看这个问题,我们把自变量做一个变换,
x ^ = S − 1 x \\hatx=S^-1 x x^=S1x
其中, S S S 由共轭向量张成,
S = [ p 0 , p 1 , ⋯   , p n − 1 ] S=\\left[p_0, p_1, \\cdots, p_n-1\\right] S=[p0,p1,,pn1]
那么二次问题变为,
ϕ ^ ( x ^ ) ≡ ϕ ( S x ^ ) = 1 2 x ^ T ( S T A S ) x ^ − ( S T b ) T x ^ \\hat\\phi(\\hatx) \\equiv \\phi(S \\hatx)=\\frac12 \\hatx^T\\left(S^T A S\\right) \\hatx-\\left(S^T b\\right)^T \\hatx ϕ^(x^)ϕ(Sx^)=21x^T(STAS)x^(STb)Tx^
由共轭性,我们知道矩阵 S T A S S^T A S STAS 是个对角矩阵,那么久变成了一个对角矩阵系数的极简方程。

共轭方向法

所谓的共轭方向法,就是给定初值点 x 0 x_0 x0 和一组共轭方向,我们通过如下方式迭代更新 x k x_k xk
x k + 1 = x k + α k p k x_k+1=x_k+\\alpha_k p_k xk+1=xk+αkpk
α k = − r k T p k p k T A p k \\alpha_k=-\\fracr_k^T p_kp_k^T A p_k αk=pkTApkrkT以上是关于共轭梯度法(CG)详解的主要内容,如果未能解决你的问题,请参考以下文章

线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序

线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序

Cupy说它已经实现了scipy的cg,但是安装时找不到cg(共轭梯度法)

什么是共轭梯度法?

共轭梯度(Conjugate Gradient,CG)算法

线性方程组的迭代解法