共轭梯度法的推导与完整算法

2023-05-16

共轭梯度法

学习自知乎:https://www.zhihu.com/question/27157047 and wikipedia and 非线性规划课

简介

在数值线性代数中,共轭梯度法是一种求解对称正定线性方程组Ax=b的迭代方法。

事实上,求解Ax=b等价于求解: m i n ∣ ∣ A x − b ∣ ∣ 2 2 min||Ax-b||_2^2 minAxb22 ,将其展开后可以得到: m i n x T A T A x − b T A x + b T b min \quad x^TA^TAx-b^TAx+b^Tb minxTATAxbTAx+bTb ,也就是等价于求解 m i n 1 2 x T A T A x − b T A x min\quad \frac{1}{2}x^TA^TAx-b^TAx min21xTATAxbTAx 。于是解方程问题就转化为了求解二次规划问题(QP)。

共轭梯度法是介于梯度下降法与牛顿法之间的一个方法,是一个一阶方法。它克服了梯度下降法收敛慢的缺点,又避免了存储和计算牛顿法所需要的二阶导数信息。

在n维的优化问题中,共轭梯度法最多n次迭代就能找到最优解(是找到,不是接近),但是只针对二次规划问题。

共轭梯度法的思想就是找到n个两两共轭的共轭方向,每次沿着一个方向优化得到该方向上的极小值,后面再沿其它方向求极小值的时候,不会影响前面已经得到的沿哪些方向上的极小值,所以理论上对n个方向都求出极小值就得到了n维问题的极小值。

算法推导过程

目标函数的标准形式:

min ⁡ x ∈ R n 1 2 x T Q x − b T x \min_{x\in R^n}\frac{1}{2}x^TQx-b^Tx minxRn21xTQxbTx

Q-conjugate: 对于正定矩阵Q,如果非零向量x,y是Q-conjugate的,那么

x T Q y = 0 x^TQy=0 xTQy=0

我们需要找到n个相互Q-conjugate的基向量 d 1 , d 2 , … , d n {d_1,d_2,…,d_n} d1,d2,,dn,它们相互共轭且线性无关

因此空间中任意向量x都可以用这组基向量表示:

x = ∑ i = 1 n a i d i x=\sum_{i=1}^na_id_i x=i=1naidi

因此我们的目标函数可以改写为:
min ⁡ a 1 , . . . , a n ∈ R n 1 2 ( ∑ i = 1 n a i d i ) T Q ( ∑ j = 1 n a j d j ) − b T ( ∑ i = 1 n a i d i ) = min ⁡ a 1 , . . . , a n ∈ R n 1 2 ∑ i = 1 n ∑ j = 1 n a i a j d i T Q d j − ∑ i = 1 n a i b T d i \min_{a_1,...,a_n\in R^n}\frac{1}{2}(\sum_{i=1}^na_id_i)^TQ(\sum_{j=1}^na_jd_j)-b^T(\sum_{i=1}^na_id_i) \\ =\min_{a_1,...,a_n\in R^n}\frac{1}{2}\sum_{i=1}^n\sum_{j=1}^na_ia_jd_i^TQd_j-\sum_{i=1}^na_ib^Td_i a1,...,anRnmin21(i=1naidi)TQ(j=1najdj)bT(i=1naidi)=a1,...,anRnmin21i=1nj=1naiajdiTQdji=1naibTdi
因为 d 1 , d 2 , … d n {d_1,d_2,…d_n} d1,d2,dn是Q-conjugate,所以由于 d i Q d j = 0 , i f i ≠ j d_iQd_j=0\quad,if\quad i\ne j diQdj=0,ifi=j,上式可以继续简化为
min ⁡ a 1 , . . . , a n ∈ R n 1 2 ∑ i = 1 n a i 2 d i T Q d i − ∑ i = 1 n a i b T d i \min_{a_1,...,a_n\in R^n}\frac{1}{2}\sum_{i=1}^na_i^2d_i^TQd_i-\sum_{i=1}^na_ib^Td_i a1,...,anRnmin21i=1nai2diTQdii=1naibTdi
将求和符号提出来后,可以得到
min ⁡ a 1 , . . . , a n ∈ R n 1 2 ∑ i = 1 n ( a i 2 d i T Q d i − a i b T d i ) \min_{a_1,...,a_n\in R^n}\frac{1}{2}\sum_{i=1}^n(a_i^2d_i^TQd_i-a_ib^Td_i) a1,...,anRnmin21i=1n(ai2diTQdiaibTdi)
原本我们的问题是寻找一个向量x,使得目标函数值最优。现在我们用 a 1 , a 2 , … a n a_1,a_2,…a_n a1,a2,an来表示 x = ( x 1 , x 2 , … . , x n ) x=(x_1,x_2,….,x_n) x=(x1,x2,.,xn),也就是我们的任务变为优化 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,,an了。

为了看的清楚点,我们把求和分开来写:
min ⁡ a 1 , . . . , a n ∈ R n 1 2 ( a 1 2 d 1 T Q d 1 + a 1 b T d 1 ) + 1 2 ( a 2 2 d 2 T Q d 2 + a 2 b T d 2 ) + . . . + 1 2 ( a n 2 d n T Q d n + a n b T d n ) \min_{a_1,...,a_n\in R^n}\frac{1}{2}(a_1^2d_1^TQd_1+a_1b^Td_1)+\frac{1}{2}(a_2^2d_2^TQd_2+a_2b^Td_2)+...+\frac{1}{2}(a_n^2d_n^TQd_n+a_nb^Td_n) a1,...,anRnmin21(a12d1TQd1+a1bTd1)+21(a22d2TQd2+a2bTd2)+...+21(an2dnTQdn+anbTdn)
这样,我们分别求第一项 1 2 ( a 1 2 d 1 T Q d 1 + a 1 b T d 1 ) \frac{1}{2}(a_1^2d_1^TQd_1+a_1b^Td_1) 21(a12d1TQd1+a1bTd1)的最小值,然后第二项,即可。

第一项是一个二次函数,求最小值我们直接求导即可:

a 1 = b T d 1 d 1 T Q d 1 a_1=\frac{b^Td_1}{d_1^TQd_1} a1=d1TQd1bTd1 ,同样可得:

a i = b T d i d i T Q d i a_i=\frac{b^Td_i}{d_i^TQd_i} ai=diTQdibTdi

所以最优解 x ∗ = ∑ i = 1 n a i d i x^*=\sum_{i=1}^na_id_i x=i=1naidi,将上式代入可得

x ∗ = ∑ i = 1 n b T d i d i T Q d i d i x^*=\sum_{i=1}^n\frac{b^Td_i}{d_i^TQd_i}d_i x=i=1ndiTQdibTdidi

现在,我们只需要构建Q-conjugate向量组 d 1 , d 2 , … , d n {d_1,d_2,…,d_n} d1,d2,,dn。有一种称为Gram-Schmidt过程的算法可以用来找到这组向量。在实际算法实现中,我们往往是边求 a i a_i ai,边求 d i d_i di。下面给出完整的共轭梯度算法。

完整算法

输入:正定矩阵Q(A),初始向量 x 0 x_0 x0,向量b

输出:最优解对应的向量 x k + 1 x_{k+1} xk+1

$r_0:=b-Qx_0 $ (r_i为第i次迭代的误差)

d 0 : = r 0 d_0:=r_0 d0:=r0 (d_i是我们要求的共轭向量)

k : = 0 k:=0 k:=0 (k表示第几次迭代)

repeat

   α k : = r k T r k d k T Q d k \alpha_k:=\frac{r_k^Tr_k}{d_k^TQd_k} αk:=dkTQdkrkTrk (该项为学习率,是求出来的,对应的是之前说的a_i)

   x k + 1 : = x k + α k d k x_{k+1}:=x_k+\alpha_kd_k xk+1:=xk+αkdk

   r k + 1 : = r k − α k Q d k r_{k+1}:=r_k-\alpha_kQd_k rk+1:=rkαkQdk

  如果 r k + 1 r_{k+1} rk+1足够小,则提前退出循环 (也就是认为已经找到最优解了)

   β k : = r k + 1 T r k + 1 r k T r k \beta_k:=\frac{r_{k+1}^Tr_{k+1}}{r_k^Tr_k} βk:=rkTrkrk+1Trk+1

   d k + 1 : = r k + 1 + β k d k d_{k+1}:=r_{k+1}+\beta_kd_k dk+1:=rk+1+βkdk (Gram-Schmidt过程求d_k)

  k:=k+1

end repeat

The result is x k + 1 x_{k+1} xk+1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共轭梯度法的推导与完整算法 的相关文章

  • 将 Word 转换为 Markdown格式 【详细教程】

    文章目录 前言 下载安装Writage Word Markdown 下载安装Pandoc 再次Word Markdown总结 提示 xff1a 以下是本篇文章正文内容 xff0c 学习内容将会持续更新 前言 俗话说 好记性不如烂笔头 在我们
  • JAVA校验SQL语句与格式化语句

    想看实现直接滑倒左下边的工具类 xff0c 前边在说得是解决思路 前言 现在需要向数据库中某张表中的某个字段中 xff0c 插入的值为SQL语句 xff0c 但是要保证插入SQL语句的正确性 xff0c 而且还需要进行格式化 xff0c 就
  • 获取墨墨背单词里面的单词书中的单词

    首先 xff0c 其实是直接尝试抓包获取的 xff0c 不过在抓包的信息中没发现类似的内容 xff0c 然后就去百度了以下 xff0c 发现还是有聪明人 把下载的 apk 文件解压缩一下 xff0c 把里面的 assets 文件夹里面的 m
  • 2021年Redis面试题(持续更新)

    目录 1 redis基础redis 中的数据类型有哪些为什么说redis能够快速执行 2 Redis中的五种数据结构string 字符串 list 列表 set 集合 hash 哈希 zset 有序集合 3 Redis的持久化Redis 的
  • 吐槽一下csdn博客选中文字之后的悬浮窗

    悬浮窗出来的莫名其妙 xff0c 还会挡文字 xff0c 展示一下我框一段文字出现的一百种情况 xff0c csdn是否考虑出一个设置可以自定义把这个功能关闭和开启 看文章很自然的会选中文字一行一行的看 xff0c 我相信很多人都是这样的
  • c语言基础

    基本语法 预定义常量及类型 函数结果状态代码 span class token macro property span class token directive hash span span class token directive k
  • c语言实现基础的排序

    1 插入排序 1 1 直接插入排序 span class token keyword void span span class token function insert sort span span class token punctua
  • 流程图怎么画

    前言 最近在看博客的时候发现很多流程图都不是流程图 xff0c 想画成流程图但是总有些时候会变了样子 xff0c 所以我就想说说流程图到底因该怎么画 组成 流程图一般由由圆角矩形 矩形 菱形 平行四边形 箭头组成 作用 流程图一般都是用圆角
  • mybatis-plus使用中遇到的问题

    mybatis plus使用中遇到的问题 mapper配置问题mybatis plus与mybatis冲突mybatis plus与pagehelper冲突 最近新搭一个测试项目 xff0c 使用了 mybatis plus当前的最新版本
  • 解决“将截断字符串或二进制数据。语句已终止。”的问题

    在EF中 xff0c 使用CodeFirst给实体添加约束的时候 xff0c 使用NeGut控制台进行更新到数据库中 xff0c 先使用add migration migrationName命令进行创建 xff08 migrationNam
  • Struts2的基本原理与实现

    Struts2是什么 百度说的 Struts2是一个基于MVC设计模式的Web应用框架 xff0c 它本质上相当于一个servlet xff0c 在MVC设计模式中 xff0c Struts2作为控制器 Controller 来建立模型与视
  • 如何用EA优雅的画流程图

    绘制流程图 1 首先在EA中新建一个流程图 xff1a 2 添加图形 添加需要的图形 xff0c 同时每个图形上面有附加的说明 xff0c 说明和图形之间的相对位置是可以移动的 不过对于画流程图来说 xff0c 还是建议将说明放在图形的正中
  • Android获得手机唯一设备ID号

    在安卓的工程中 xff0c 往往需要获得手机设备唯一的ID号 xff0c 我们可以用TelephonyManager类来获得 xff1a 首先声明一个TelephonyManager类的对象 xff1a 接着声明一个String类型的变量
  • (综合)xorg-xserver相关完全解析

    本文主要是从以下几个方面介绍xorg xserver 相关的知识 1 linux系统图形界面框架 2 xserver 和x client启动过程 3 图形2d xff0c 3d加速原理简介 4 xserver主分支代码解析 5 xserve
  • 小新 Pro 13‘ 2020 macOS 安装教程

    小新 Pro 13 2020 macOS 安装教程 电脑配置 CPU xff1a Intel Core i5 10210U CPU 64 1 60GHz 4C8T RAM xff1a 板载 16 GB 2666 MHz DDR4 硬盘 xf
  • IDEA社区版创建spring boot项目的安装插件

    由于最近idea的官方查的有点严 xff0c pojie的企业版idea总失效 xff0c 现在给大家说一下社区版idea创建spring项目的一个方法 xff01 xff01 xff01 在项目实战中了解到的IDEA创建springboo
  • 软件工程论述题:衡量模块独立性的两个标准是什么?各表示什么含义?

    8 衡量模块独立性的两个标准是什么 各表示什么含义 内聚和耦合 内聚 又称为块内联系 指模块内部各成分之间相互关联的程度 以高内聚为设计目标 耦合 也称块间联系 模块之间相互联系程度的度量 联系越紧密 耦合性越强 独立性越差 以低耦合为设计
  • linux如何查看wifi信号强弱

    在linux中观察wifi信号强弱 xff0c 可以通过dBm数值来判断 现在来看这个所谓的dBm xff0c 数值范围在 XX 0之间 这个数越大 xff0c 信号强度越高 50dBm 0dBm范围内 xff0c 恭喜你 xff0c 你的
  • Edge浏览器的书签(收藏夹)文件夹地址在哪?

    最近因为工作电脑经常重装系统 xff0c 所以每次重装系统之前都要备份一些数据 xff0c Edge浏览器这两年突然香了起来 xff0c 插件yyds xff01 所以平时生活还是使用Edge会多一点 xff0c 但是收藏夹备份却吃了大亏
  • CCS5.4+Proteus8的F28027实践课二、定时器0控制LED流水灯

    刚游泳回来 xff0c 看到昨晚那篇博客访问量比较高 xff0c 对我是莫大的鼓励 xff0c 所以马不停蹄的去找了相关的手册准备我们今天的课程 今天我们要说的是用定时器0产生的定时中断让LED闪烁 大家都是大部分都是工科出身 xff0c

随机推荐

  • dns2tcp搭建DNS隧道绕过校园网

    1 问题场景 在学校是如果校园网没钱了 xff0c 难道就不能上网了 xff1f xff1f xff1f xff1f 对于从事技术的人来说尤其是学计算机出身的人来说这是不能容忍的 我们看下面场景 xff1a 当我们校园网没有认证时 xff0
  • 关闭浏览器的跨域

    无损关闭浏览器的跨域 关闭浏览器的安全模式 注意 xff01 这样会导致一些网站无法访问 xff0c 比如谷歌无法登录等 所以建议使用一个非主要的浏览器开启 编辑桌面的chrome 或者 edge 浏览器快捷方式 右键快捷方式 xff0c
  • CentOS安装MySQL(YUM源安装)

    安装mysql主要分为两种方式 xff0c 本次简单介绍使用YUM源进行安装mysql xff0c 如果不是使用docker xff0c 可以跳过步骤1 2 1 docker环境准备 在安装mysql之前 xff0c 请先确认使用的cent
  • 将门禁卡写入到手机、手环,加密卡也能写

    前言 准备材料 IC卡操作 读取IC卡数据 xff08 必看 xff09 写入到小米手环 写入到带有NFC的手机 复制IC卡 ID卡操作 读取ID卡数据 复制ID卡 前言 门禁卡大多以IC卡 ID卡为主IC卡又分为UID CUID等等只有I
  • Ubuntu中开启ssh服务的方法

    我们可以在网上看到很多关于Ubuntu开启SSH服务的文章 xff0c 但是介绍的有很多方法都是不够理想的 xff0c 这些方法都无法实现远程登录到Ubuntu上 xff0c 那么下面就让小编为大家分享Ubuntu中开启ssh服务的方法 s
  • fedora 的kde桌面无法输入中文问题

    简单三步 xff1a xff08 1 xff09 xff1a sudo yum y install ibus 安装ibus拼音库 xff08 2 xff09 xff1a sudo yum y install im chooser 安装拼音切
  • go切片常见错误

    x1f447 下面代码会输出什么 xff1f slices span class token operator 61 span span class token function make span span class token pun
  • OpenVINO的部署和使用

    现在几乎每家硬件或互联网公司都推出了自家的机器学习框架 xff0c 小米的mace 谷歌的TensorFlow Facebook的Torch等等 今天要介绍的是Inter公司出品的OpenVINO OpenVINO主要分为Model Opt
  • Mybatis-Plus分页插件

    引言 xff1a MyBatis Plus自带分页插件 xff0c 只要简单的配置即可实现分页功能 1 添加Configuration配置类 64 Configuration 64 MapperScan 34 com atguigu myb
  • 关于manjaro命令行界面方块乱码

    通常情况下这些方块乱码是中文 xff0c 其实这篇文档讲的很清楚 xff0c 如果 etc locale conf中有设置LANG 61 zh CN UTF 8就会导致tty乱码 解决办法也如文档所说有两个 xff1a 首先是修改 etc
  • 如何安装arm交叉工具链及问题解决

    在进行基于arm的嵌入式linux开发时 xff0c 首先要安装交叉工具链 要按照交叉工具链首先要获得交叉工具链的压缩包 xff0c 我这里用的是开发板上自带的压缩包 xff1a arm linux gcc 4 5 1 v6 vfp tgz
  • 04)go语言使用优化 启动时不打开CMD控制台,后台运行

    一 生成没有cmd窗口的exe程序 1 目前go语言生成exe我是在goland运行时设置了输出路径 xff0c 运行时就会产生exe可执行文件 2 默认是执行的go bulid指令 xff0c 生成的ext双击打开是有CMD窗口的 xff
  • C#使用RDP远程桌面

    由于本人是做数据库维护经常使用到远程桌面 xff0c 但是windows自带的远程桌面难以区分很不方便 xff0c 所以我自己写了一个RDP RDP一共修改了两次 第一种思路就是使用windows自带的RDP xff0c 保存成RDP文件
  • 【Altium秘籍】room 复制报错的解决办法

    在使用多通道绘图时 nbsp 有时会出现 nbsp 后加的通道 无法拷贝room格式 nbsp 仔细看会发现 是由于新建的 room 不属于原来的 类中 这个原因 个人觉得是 软件的bug nbsp 更新数据时遗漏导致 数据不同步 目前 n
  • 将多边形点按照逆时针排序

    Point center bool PointCmp const Point amp a const Point amp b if a x gt 61 0 amp amp b x lt 0 return true if a x 61 61
  • 排队论入门学习 (for 数学建模)

    排队论入门学习 xff08 for 数学建模 xff09 文字部分引用了很多浙大数学建模排队论ppt中的内容 xff0c 本人做个总结和代码实现 为什么研究排队论 xff1f 研究排队问题 xff0c 就是要把排队的时间控制到一定的程度内
  • 层次分析法(AHP)

    层次分析法 xff08 AHP xff09 问题的提出 日常生活中有许多决策问题 决策是指在面临多种方案时需要依据一定的标准选择某一种方案 购物 xff1a 买钢笔 xff0c 一般要依据质量 颜色 实用性 价格等方面的因素来选择某一只钢笔
  • 遗传算法解决TSP问题(c++实现)

    遗传算法 遗传算法简介 遗传算法 Genetic Algorithms xff0c 简称 GA 是一种基于自然选择原理和自然遗传机制的搜索 寻优 算法 xff0c 它是模拟自然界中的生命进化机制 xff0c 在人工系统中实现特定目标的优化
  • 灰色预测模型GM(1,1) 与例题分析

    灰色预测模型 灰色预测的概念 xff08 1 xff09 灰色系统 白色系统和黑色系统 白色系统是指一个系统的内部特征是完全已知的 xff0c 既系统信息是完全充分的 黑色系统是一个系统的内部信息对外界来说是一无所知的 xff0c 只能通过
  • 共轭梯度法的推导与完整算法

    共轭梯度法 学习自知乎 xff1a https www zhihu com question 27157047 and wikipedia and 非线性规划课 简介 在数值线性代数中 xff0c 共轭梯度法是一种求解对称正定线性方程组Ax