今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法。我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法。

我们先从一种特殊的线性方程组的定义开始,比如我们需要解如下的线性方程组:

Ax=b" role="presentation">Ax=bAx=b

这里的 A(n×n)" role="presentation" style="position: relative;">A(n×n)A(n×n) 是对称,正定矩阵, b(n×1)" role="presentation" style="position: relative;">b(n×1)b(n×1) 同样也是已知的列向量,我们需要通过 A" role="presentation" style="position: relative;">AA 和 b" role="presentation" style="position: relative;">bb 来求解 x(n×1)" role="presentation" style="position: relative;">x(n×1)x(n×1), 这其实是我们熟知的一些线性系统的表达式。

直接求解

首先,我们来看一种直观的解法,我们定义满足如下关系的向量为关于 矩阵 A" role="presentation" style="position: relative;">AA 的共轭向量,

uTAv=0" role="presentation">uTAv=0uTAv=0

因为矩阵 A" role="presentation" style="position: relative;">AA 是对称正定矩阵,所以矩阵 A" role="presentation" style="position: relative;">AA 定义了一个内积空间:

⟨u,v⟩A:=⟨Au,v⟩=⟨u,ATv⟩=⟨u,Av⟩=uTAv" role="presentation">⟨u,v⟩A:=⟨Au,v⟩=⟨u,ATv⟩=⟨u,Av⟩=uTAv⟨u,v⟩A:=⟨Au,v⟩=⟨u,ATv⟩=⟨u,Av⟩=uTAv

基于此,我们可以定义一组向量 P" role="presentation" style="position: relative;">PP

P={p1,…,pn}" role="presentation">P={p1,…,pn}P={p1,…,pn}

其中的向量 p1" role="presentation" style="position: relative;">p1p1 , p2" role="presentation" style="position: relative;">p2p2, … , pn" role="presentation" style="position: relative;">pnpn 都是互为共轭的,那么 P" role="presentation" style="position: relative;">PP 构成了 Rn" role="presentation" style="position: relative;">RnRn 空间的一个基,上述方程的解 x∗" role="presentation" style="position: relative;">x∗x∗ 可以表示成 P" role="presentation" style="position: relative;">PP 中向量的线性组合:

x∗=∑i=1nαipi" role="presentation">x∗=∑i=1nαipix∗=∑i=1nαipi

根据上面的表达式,我们可以得到:

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)" role="presentation">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" role="presentation">αk=⟨pk,b⟩⟨pk,pk⟩Aαk=⟨pk,b⟩⟨pk,pk⟩A

所以,如果我们要直接求解的,可以先对矩阵 A" role="presentation" style="position: relative;">AA 进行特征值分解,求出一系列的共轭向量,然后求出系数,最后可以得到方程的解 x∗" role="presentation" style="position: relative;">x∗x∗

迭代求解

上面的方法已经说明,x∗" role="presentation" style="position: relative;">x∗x∗ 是一系列共轭向量 p" role="presentation" style="position: relative;">pp 的线性组合,学过 PCA 的都知道,可以用前面占比高的向量组合进行逼近,而不需要把所有的向量都组合到一起,PCG 也是用到了这种思想,通过仔细的挑选共轭向量 p" role="presentation" style="position: relative;">pp 来重建方程的解 x∗" role="presentation" style="position: relative;">x∗x∗。

我们先来看下面的一个方程:

f(x)=12xTAx−xTb,x∈Rn" role="presentation">f(x)=12xTAx−xTb,x∈Rnf(x)=12xTAx−xTb,x∈Rn

对上面的方程求导,我们可以得到:

D2f(x)=A" role="presentation">D2f(x)=AD2f(x)=A
Df(x)=Ax−b" role="presentation">Df(x)=Ax−bDf(x)=Ax−b

可以看到,方程的一阶导数就是我们需要解的线性方程组,令一阶导数为 0,那么我们需要解的就是这样一个线性方程组了。

假设我们随机定义 x" role="presentation" style="position: relative;">xx 的一个初始向量为 x0" role="presentation" style="position: relative;">x0x0,那么我们可以定义第一个共轭向量为 p0=b−Ax0" role="presentation" style="position: relative;">p0=b−Ax0p0=b−Ax0, 后续的基向量都是和梯度共轭的,所以称为共轭梯度法。

下面给出详细的算法流程:

而 preconditioned conjugate gradient method 与共轭梯度法的不同之处在于预先定义了一个特殊矩阵 M" role="presentation" style="position: relative;">MM:

参考来源:wiki 百科

https://en.wikipedia.org/wiki/Conjugate_gradient_method#The_preconditioned_conjugate_gradient_method

机器学习: 共轭梯度算法(PCG)的更多相关文章

  1. 共轭梯度算法求最小值-scipy

    # coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...

  2. 机器学习中的算法-决策树模型组合之随机森林与GBDT

    机器学习中的算法(1)-决策树模型组合之随机森林与GBDT 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使 ...

  3. [机器学习Lesson3] 梯度下降算法

    1. Gradient Descent(梯度下降) 梯度下降算法是很常用的算法,可以将代价函数J最小化.它不仅被用在线性回归上,也被广泛应用于机器学习领域中的众多领域. 1.1 线性回归问题应用 我们 ...

  4. 【转载】NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩、机器学习及最优化算法

    原文:NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩.机器学习及最优化算法 导读 AI领域顶会NeurIPS正在加拿大蒙特利尔举办.本文针对实验室关注的几个研究热点,模型压缩.自 ...

  5. 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码

    在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...

  6. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  7. 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

    机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...

  8. 机器学习十大算法 之 kNN(一)

    机器学习十大算法 之 kNN(一) 最近在学习机器学习领域的十大经典算法,先从kNN开始吧. 简介 kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个" ...

  9. Mahout 系列之----共轭梯度

    无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...

随机推荐

  1. 使用iText快速更新书签

    一.介绍 pdfbox基于Apache协议,商用无需开放源代码. iText基于APGL协议,打包和修改需发布源码,除非花钱买断. 二.用途 下载的电子书,有的书签是FitHeight,也就是缩放后整 ...

  2. MapReduce分布式算法

    一.MapReduce 有一种特殊的并行算法,就是分布式算法.在并行算法只需要两个到四个内核时,完全可以在笔记本电脑上运行,但是如果需要数百个内核,这种情况下,可让算法在多台计算机上运行. 假设你有一 ...

  3. Chargen UDP服务远程拒绝服务攻击漏洞修复教程

    一.前置说明 chargen服务最初设计用于测试网络状态,监听19端口(包括TCP和UDP),其中UDP协议存在“Chargen UDP服务远程拒绝服务攻击漏洞”. chargen一般不会使用,所以直 ...

  4. Weblogic domain扩展教程

    weblogic扩展domain有两种扩展,一是机器上已有要扩展的domain只是在其内增加受管服务器,二是机器上没有domain要新建domain然后增加受管服务器 一.机器上已有要扩展的domai ...

  5. MySQL修改版本号教程

    处理扫描器扫出的漏洞,基本有四种方法:一是升级软件包到新版本(包括打补丁和整个替换升级),二是修改banner配置项(包括禁用banner和修改banner内容),三是添加白名单(包括主机防火墙和软件 ...

  6. weblogic开启http访问日志并实时写入日志文件

    由于http访问会产生大量日志,耗去不少IO和CPU所以在生产一般是不启用的:但有时我们会想启用http访问日志,尤其是在系统上线调试的时候. weblogic的日志默认在domain_name/se ...

  7. globals() 和 locals() 函数

    globals() 和 locals() 函数 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字. 如果在函数内部调用 locals(),返回的 ...

  8. php 日志模块源码解析

    php日志模块设计 Monolog 是PHP的一个日志类库解析 整体介绍:monolog日志模块遵循 PSR3 的接口规范.主要有日志格式类接口(格式化日志信息),处理类接口(写日志的驱动,通过扩展写 ...

  9. checkbox多选按钮变成单选

    <input id="a" type="checkbox"/><input id="b" type="check ...

  10. NOI2019冬令营报到通知

    由中国计算机学会(CCF)主办的2019全国青少年信息学奥林匹克冬令营(CCF NOI 2019冬令营)将于2019年1月24日-31日在广州市第二中学举行.其中1月24日为报到日,1月31日为疏散日 ...