机器人中的数值优化|【六】线性共轭梯度法,牛顿共轭梯度法

机器人中的数值优化|【六】线性共轭梯度法,牛顿共轭梯度法

往期回顾

机器人中的数值优化|【一】数值优化基础
机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例
机器人中的数值优化|【三】无约束优化,拟牛顿法理论与推导
机器人中的数值优化|【四】L-BFGS理论推导与延伸
机器人中的数值优化|【五】BFGS算法非凸/非光滑处理
关于牛顿-共轭梯度法,笔者认为对其最直接和最根本的认识,这篇帖子写得特别好,可以参考東雲正樹的 如何理解共轭梯度法 一文。

为什么要用Conjugate Gradient method?

从前面的系列我们知道,对于一个凸的无约束优化,我们总是希望通过梯度,基于这样那样的方法来到达最优点。在前面基本的梯度下降方法中,我们每次计算一个梯度,并根据线性搜索得到的一个较为不错的步长,向前优化一步。在Newton-CG method中我们不禁要提问了:有没有一种可以有确定的搜索次数,而且次数还比较少的方法呢?这个方法就是Newton-CG method。我们知道在向量中存在标准正交集的概念,在优化问题中,我们也存在共轭梯度的概念,关于共轭梯度的具体定义和推导可以进一步查阅相关的资料。本质上,就是把原来随机走梯度的过程,变为在凸问题空间中“正交”的梯度向量上,每个向量只走一步,且是最优的一步的过程。
梯度下降与共轭梯度法
从上面的例子我们可以看到,绿色为共轭梯度法,红色为梯度下降法,我们其实要做的工作就是在椭圆的切向和法向各走“最优”的一步,一步到位即可。

Gram-Schmitd正交化/施密特正交化

理解共轭梯度法,首先我们要回顾一个东西,那就是施密特正交化。利用施密特正交化,我们可以从空间中的一组向量得到互相正交的一组向量集。如果我们有一组互不平行的向量 [ α 1 , α 2 , α 3 , α 4 , α 5 , . . . ] {[\alpha_1, \alpha_2, \alpha_3, \alpha_4, \alpha_5,...]} [α1,α2,α3,α4,α5,...],利用一下公式可以得到正交基:
β 1 = α 1 \beta_1 = \alpha_1 β1=α1
β 2 = α 2 − ( β 1 , α 2 ) ( β 1 , β 1 ) β 1 \beta_2 = \alpha_2 - \frac{(\beta_1, \alpha_2)}{(\beta_1, \beta_1)} \beta_1 β2=α2(β1,β1)(β1,α2)β1
β 3 = α 3 − ( β 1 , α 3 ) ( β 1 , β 1 ) β 1 − ( β 2 , α 3 ) ( β 2 , β 2 ) β 2 \beta_3 = \alpha_3 - \frac{(\beta_1, \alpha_3)}{(\beta_1, \beta_1)} \beta_1 - \frac{(\beta_2, \alpha_3)}{(\beta_2, \beta_2)} \beta_2 β3=α3(β1,β1)(β1,α3)β1(β2,β2)(β2,α3)β2
β 4 = α 4 − ( β 1 , α 4 ) ( β 1 , β 1 ) β 1 − ( β 2 , α 4 ) ( β 2 , β 2 ) β 2 − ( β 3 , α 4 ) ( β 3 , β 3 ) β 3 \beta_4 = \alpha_4 - \frac{(\beta_1, \alpha_4)}{(\beta_1, \beta_1)} \beta_1 - \frac{(\beta_2, \alpha_4)}{(\beta_2, \beta_2)} \beta_2 - \frac{(\beta_3, \alpha_4)}{(\beta_3, \beta_3)} \beta_3 β4=α4(β1,β1)(β1,α4)β1(β2,β2)(β2,α4)β2(β3,β3)(β3,α4)β3
. . . ... ...

线性共轭梯度法

对于如下的一个问题
a r g m i n x f ( x ) = 1 2 x T A x − b T x argmin_x f(x) = \frac{1}{2}x^TAx - b^Tx argminxf(x)=21xTAxbTx
我们要求其无约束优化。这里我们可以引入共轭梯度的概念,其概念类似于正交向量,对于一个正交向量 u , v u,v u,v,有 u T v = 0 u^Tv =0 uTv=0。一个矩阵 A A A,如果存在向量 u , v u,v u,v,有 u T A v = 0 u^TAv=0 uTAv=0,则我们认为 u , v u,v u,v关于 A A A共轭。在下降过程中,如果我们每一步选择的下降方向都是一个独立的共轭向量,且一共有 n n n个共轭向量,则最多需要 n n n步即可下降到最优点。

回顾优化过程,最核心的公式为
x k + 1 = x k + α u k x_{k+1} = x_k + \alpha u_k xk+1=xk+αuk
其中 u k u_k uk为下降方向, α \alpha α为步长。将 x k + 1 x_{k+1} xk+1代入最优化目标公式,我们有
a r g m i n x f ( x k + 1 ) = a r g m i n x f ( x k + α u k ) argmin_x f(x_{k+1}) = argmin_x f(x_k + \alpha u_k) argminxf(xk+1)=argminxf(xk+αuk)
假设下降方向已经确定了,我们要确定最优步长
a r g m i n x f ( x k + α u k ) = a r g m i n x 1 2 ( x k + α u k ) T A ( x k + α u k ) − b T ( x k + α u k ) argmin_x f(x_k + \alpha u_k) = argmin_x \frac{1}{2}(x_k + \alpha u_k)^TA(x_k + \alpha u_k) - b^T(x_k + \alpha u_k) argminxf(xk+αuk)=argminx21(xk+αuk)TA(xk+αuk)bT(xk+αuk)
α \alpha α求导,有
a r g m i n x f ′ ( x k + α u k ) = 0 argmin_x f'(x_k + \alpha u_k) = 0 argminxf(xk+αuk)=0
解得
α = b T u k − x k T A u k u k T A u k \alpha = \frac{b^Tu_k - x_k^TAu_k}{u_k^TAu_k} α=ukTAukbTukxkTAuk
这里的 α \alpha α是最优步长的一个“尺度”,也就是scalar。那么问题来了,我们想要每次下降都能够是共轭方向的,怎么办呢?

设每次迭代之后的误差量为
r k = A x k − b r_k = Ax_k - b rk=Axkb

u k = − r k + β k u k − 1 u_k = -r_k + \beta_k u_{k-1} uk=rk+βkuk1
两边乘以 u k − 1 T A u_{k-1}^TA uk1TA
u k − 1 T A u k = − u k − 1 T A r k + u k − 1 T A β k u k − 1 u_{k-1}^TAu_{k} = -u_{k-1}^TAr_k + u_{k-1}^TA\beta_ku_{k-1} uk1TAuk=uk1TArk+uk1TAβkuk1
因为我们想要得到的是共轭方向,所以认为 u k − 1 T A u k = 0 u_{k-1}^TAu_{k} =0 uk1TAuk=0
− u k − 1 T A r k + u k − 1 T A β k u k − 1 = 0 -u_{k-1}^TAr_k + u_{k-1}^TA\beta_ku_{k-1} = 0 uk1TArk+uk1TAβkuk1=0
β k = r k T A u k − 1 u k − 1 T A u k − 1 \beta_k= \frac{r_k^T A u_{k-1}}{u_{k-1}^TAu_{k-1}} βk=uk1TAuk1rkTAuk1
在这里我们就可以得到一个缩放标量 β k \beta_k βk可以迭代计算共轭向量,最后得到的算法如下所示
在这里插入图片描述

优化线性共轭梯度法

进一步的,我们可以提出更高效的线性共轭梯度法。首先引入一些定理(这里的 p p p就是 u u u
在这里插入图片描述

在这里插入图片描述
根据前面的公式,有
α = b T u k − x k T A u k u k T A u k = − r k T u k u k T A u k \alpha = \frac{b^Tu_k - x_k^TAu_k}{u_k^TAu_k} = \frac{-r_k^Tu_k}{u_k^TAu_k} α=ukTAukbTukxkTAuk=ukTAukrkTuk
由于 u k = − r k + β k u k − 1 u_k = -r_{k} + \beta_k u_{k-1} uk=rk+βkuk1
α = − r k T ( − r k + β u k − 1 ) u k T A u k \alpha = \frac{-r_k^T(-r_k+\beta u_{k-1})}{u_k^TA u_k} α=ukTAukrkT(rk+βuk1)
由于 r k T u k − 1 = 0 r_k^Tu_{k-1}=0 rkTuk1=0

α k = r k T r k u k T A u k \alpha_k = \frac{r_k^Tr_k}{u_k^TA u_k} αk=ukTAukrkTrk
由于 α k A p k = r k + 1 − r k \alpha_kAp_k = r_{k+1}-r_k αkApk=rk+1rk
继续代入有
β k + 1 = r k + 1 T r k + 1 r k T r k \beta_{k+1} = \frac{r_{k+1}^Tr_{k+1}}{r_{k}^Tr_{k}} βk+1=rkTrkrk+1Trk+1
在这里插入图片描述
下一节中,将介绍牛顿共轭梯度法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148016.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

stm32 - 中断

stm32 - 中断 概念中断向量表NVIC 嵌套中断向量控制器优先级 中断EXTI概念基本结构例子- 对射式红外传感器计次例子 - 旋转编码器 概念 stm32 支持的中断资源(都属于外设) EXTITIMADCUSARtSPII2C stm32支持的中断 内核中断 外设中断 中断通道与优先级 一…

C# 读取Execl文件3种方法

方法 1,使用OLEDB可以对excel文件进行读取 1.1C#提供的数据连接有哪些 对于不同的.net数据提供者,ADO.NET采用不同的Connection对象连接数据库。这些Connection对我们屏蔽了具体的实现细节,并提供了一种统一的实现方法。 Connection类有四…

【Linux】线程池

目录 一、线程池1.什么是线程池2.线程池图解3.实现代码 二、单例模式1.单例模式的概念2.饿汉方式实现单例模式3.懒汉方式实现单例模式4.懒汉方式实现单例模式的线程池 一、线程池 1.什么是线程池 线程虽然比进程轻量了很多,但是每创建一个线程时,需要向…

UCOS的任务创建和删除

一、任务创建和删除的API函数 1、任务创建和删除本质就是调用uC/OS的函数 API函数 描述 OSTaskCreate() 创建任务 OSTaskDel() 删除任务 注意: 1,使用OSTaskCreate() 创建任务,任务的任务控制块以及任务栈空间所需的内存&#xff0c…

算法——买卖股票问题

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 一、 究其就是个动态规划的问题 算法实现图 初始化 由于有三个阶段,买入,可交易,冷冻期,那么用dp表表示现在为止的最大利润,则有 dp[0][…

asp.net core 远程调试

大概说下过程: 1、站点发布使用Debug模式 2、拷贝到远程服务器,以及iis创建站点。 3、本地的VS2022的安装目录:C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE下找Remote Debugger 你的服务器是64位就拷贝x64的目…

详解Linux的系统调用fork()函数

在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。具体来说,fork()函数会在当前进程的地址空间中复制一份子进程,并且这个子进程几乎完全与父进程相同,包括进程代码、数据、堆栈以及打开的文…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC ,碰到的问题只能上安全的WebSocket(WSS)才能解决,配置证书还是挺麻烦的,主要是每年都需要重新更新证书,我配置过的证书最长有效期也只有两年,搞不…

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装

ElasticSearch第四讲:ES详解:ElasticSearch和Kibana安装 本文是ElasticSearch第四讲:ElasticSearch和Kibana安装,主要介绍ElasticSearch和Kibana的安装。了解完ElasticSearch基础和Elastic Stack生态后,我们便可以开始…

ctfshow—1024系列练习

1024 柏拉图 有点像rce远程执行,有四个按钮,分别对应四份php文件,开始搞一下。一开始,先要试探出 文件上传到哪里? 怎么读取上传的文件? 第一步:试探上传文件位置 直接用burp抓包,…

力扣练习——链表在线OJ

目录 提示: 一、移除链表元素 题目: 解答: 二、反转链表 题目: 解答: 三、找到链表的中间结点 题目: 解答: 四、合并两个有序链表(经典) 题目: 解…

【数据结构---排序】很详细的哦

本篇文章介绍数据结构中的几种排序哦~ 文章目录 前言一、排序是什么?二、排序的分类 1.直接插入排序2.希尔排序3.选择排序4.冒泡排序5.快速排序6.归并排序总结 前言 排序在我们的生活当中无处不在,当然,它在计算机程序当中也是一种很重要的操…

聊聊常见的IO模型 BIO/NIO/AIO 、DIO、多路复用等IO模型

聊聊常见的IO模型 BIO/NIO/AIO/DIO、IO多路复用等IO模型 文章目录 一、前言1. 什么是IO模型2. 为什么需要IO模型 二、常见的IO模型1. 同步阻塞IO(Blocking IO,BIO)2. 同步非阻塞IO(Non-blocking IO,NIO)3.…

排序算法之【希尔排序】

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

八大排序源码(含优化)

文章目录 1、直接插入排序2、希尔排序3、选择排序4、冒泡排序5、堆排序6、快速排序快速排序递归实现霍尔法挖坑法前后指针法快速排序小区间优化 快速排序非递归实现 7、归并排序归并排序递归实现归并排序非递归 8、计数排序 大家好,我是纪宁,这篇文章是关…

java Spring Boot 自动启动热部署 (别再改点东西就要重启啦)

上文 java Spring Boot 手动启动热部署 我们实现了一个手动热部署的代码 但其实很多人会觉得 这叫说明热开发呀 这么捞 写完还要手动去点一下 很不友好 其实我们开发人员肯定是希望重启这种事不需要自己手动去做 那么 当然可以 我们就让它自己去做 Build Project 这个操作 我们…

Linux性能优化--性能工具:系统内存

3.0.概述 本章概述了系统级的Linux内存性能工具。本章将讨论这些工具可以测量的内存统计信息,以及如何使用各种工具收集这些统计结果。阅读本章后,你将能够: 理解系统级性能的基本指标,包括内存的使用情况。明白哪些工具可以检索…

Java21 新特性

文章目录 1. 概述2. JDK21 安装与配置3. 新特性3.1 switch模式匹配3.2 字符串模板3.3 顺序集合3.4 记录模式(Record Patterns)3.5 未命名类和实例的main方法(预览版)3.6 虚拟线程 1. 概述 2023年9月19日 ,Oracle 发布了…

电子计算机核心发展(继电器-真空管-晶体管)

目录 继电器 最大的机电计算机之一——哈弗Mark1号,IBM1944年 背景 组成 性能 核心——继电器 简介 缺点 速度 齿轮磨损 Bug的由来 真空管诞生 组成 控制开关电流 继电器对比 磨损 速度 缺点 影响 代表 第一个可编程计算机 第一个真正通用&am…

使用晶体管做布尔逻辑和逻辑门

目录 二进制,三进制,五进制 true,false表示0,1 早期计算机采用进制 布尔逻辑 三个基本操作:NOT,AND,OR 基础“真值表” NOT 如何实现? AND如何实现? OR如何实现? 图标表示…