zoukankan      html  css  js  c++  java
  • 机器学习: 共轭梯度算法(PCG)

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

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

    Ax=b

    这里的 A(n×n) 是对称,正定矩阵, b(n×1) 同样也是已知的列向量,我们需要通过 Ab 来求解 x(n×1), 这其实是我们熟知的一些线性系统的表达式。

    直接求解

    首先,我们来看一种直观的解法,我们定义满足如下关系的向量为关于 矩阵 A 的共轭向量,

    uTAv=0

    因为矩阵 A 是对称正定矩阵,所以矩阵 A 定义了一个内积空间:

    u,vA:=Au,v=u,ATv=u,Av=uTAv

    基于此,我们可以定义一组向量 P

    P={p1,,pn}

    其中的向量 p1 , p2, … , pn 都是互为共轭的,那么 P 构成了 Rn 空间的一个基,上述方程的解 x 可以表示成 P 中向量的线性组合:

    x=i=1nαipi

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

    Ax=i=1nαiApipkTAx=i=1nαipkTApi(Multiply left by pkT)pkTb=i=1nαipk,piA(Ax=b and u,vA=uTAv)pk,b=αkpk,pkA(uTv=u,v and ik:pk,piA=0)

    这意味着:

    αk=pk,bpk,pkA

    所以,如果我们要直接求解的,可以先对矩阵 A 进行特征值分解,求出一系列的共轭向量,然后求出系数,最后可以得到方程的解 x

    迭代求解

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

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

    f(x)=12xTAxxTb,xRn

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

    D2f(x)=A

    Df(x)=Axb

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

    假设我们随机定义 x 的一个初始向量为 x0,那么我们可以定义第一个共轭向量为 p0=bAx0, 后续的基向量都是和梯度共轭的,所以称为共轭梯度法。

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

    这里写图片描述

    而 preconditioned conjugate gradient method 与共轭梯度法的不同之处在于预先定义了一个特殊矩阵 M

    这里写图片描述

    参考来源:wiki 百科

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

  • 相关阅读:
    股票交易接口
    股票自动买卖
    安信证券接口的demo做得不好。
    MEF bug? 无法加载外部的DLL
    如何移植行情软件的指标到千发股票自动交易软件?
    股票策略交易
    博客园自动关注病毒 只活了一小会儿。
    Float 运算的怪异性
    文件大小和占用空间为何不一样
    做最好的自己
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9412105.html
Copyright © 2011-2022 走看看