机器学习: 共轭梯度算法(PCG)
今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法。我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法。
我们先从一种特殊的线性方程组的定义开始,比如我们需要解如下的线性方程组:
这里的 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 的共轭向量,
因为矩阵 A" role="presentation" style="position: relative;">AA 是对称正定矩阵,所以矩阵 A" role="presentation" style="position: relative;">AA 定义了一个内积空间:
基于此,我们可以定义一组向量 P" role="presentation" style="position: relative;">PP
其中的向量 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 中向量的线性组合:
根据上面的表达式,我们可以得到:
这意味着:
所以,如果我们要直接求解的,可以先对矩阵 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∗。
我们先来看下面的一个方程:
对上面的方程求导,我们可以得到:
可以看到,方程的一阶导数就是我们需要解的线性方程组,令一阶导数为 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)的更多相关文章
- 共轭梯度算法求最小值-scipy
# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...
- 机器学习中的算法-决策树模型组合之随机森林与GBDT
机器学习中的算法(1)-决策树模型组合之随机森林与GBDT 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使 ...
- [机器学习Lesson3] 梯度下降算法
1. Gradient Descent(梯度下降) 梯度下降算法是很常用的算法,可以将代价函数J最小化.它不仅被用在线性回归上,也被广泛应用于机器学习领域中的众多领域. 1.1 线性回归问题应用 我们 ...
- 【转载】NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩、机器学习及最优化算法
原文:NeurIPS 2018 | 腾讯AI Lab详解3大热点:模型压缩.机器学习及最优化算法 导读 AI领域顶会NeurIPS正在加拿大蒙特利尔举办.本文针对实验室关注的几个研究热点,模型压缩.自 ...
- 【原创】机器学习之PageRank算法应用与C#实现(2)球队排名应用与C#代码
在上一篇文章:机器学习之PageRank算法应用与C#实现(1)算法介绍 中,对PageRank算法的原理和过程进行了详细的介绍,并通过一个很简单的例子对过程进行了讲解.从上一篇文章可以很快的了解Pa ...
- 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍
考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...
- 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法
机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...
- 机器学习十大算法 之 kNN(一)
机器学习十大算法 之 kNN(一) 最近在学习机器学习领域的十大经典算法,先从kNN开始吧. 简介 kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个" ...
- Mahout 系列之----共轭梯度
无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...
随机推荐
- ES6 开发常用新特性以及简述ES7
一.关于变量 ES6新增:块级作用域变量 1.let定义块级作用域变量 没有变量的提升,必须先声明后使用 let声明的变量,不能与前面的let,var,conset声明的变量重名 { { consol ...
- Linux下切换使用两个版本的JDK
Linux下切换使用两个版本的JDK 我这里原来已经配置好过一个1.7版本的jdk. 输出命令: java -version [root@hu-hadoop1 sbin]# java -version ...
- NOIP2012国王游戏(60分题解)
题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王站在队伍的最前面 ...
- nmon+nmon analyser安装使用教程
nmon一般是两种用法,一是交互式用法查看实时的内存/cpu/网络/磁盘等情况,二是抓取一段时间内的实时的内存/cpu/网络/磁盘记到csv格式的.nmon文件中然后用nmon analyse做可视化 ...
- Nop 4.1版本已经迁移到.net core2.1版本
1. github 下载,4.1版本,运行, install时,会让你新增后台账户密码,sql服务器 2. 在Configuration 新增Language 3. 上传中文语言包 , 你也可以先导出 ...
- JavaScript应用于asp开发场景
JavaScript应用于asp开发场景 演示代码示例: <%Path="../"%> <!--#include file="../../Inc/Con ...
- js之DOM元素遍历
对于元素间的空格,IE9之前的版本不会返回文本节点,而且他所有浏览器都会返回文本节点.这样就导致 使用childNodes和firstChild等属性时的行为不一致.从而有了Element Trave ...
- Uboot代码分析
(1)确定链接脚本文件:uboot根目录下Makefile中的LDSCRIPT宏值,就是指定链接脚本(如:arch/arm/cpu/u-boot.lds)路径用的.(2)从脚本文件找入口: 在链接脚本 ...
- 延时显示(类QQ头像显示)
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 你应该这样理解JVM内存管理
在进行Java程序设计时,一般不涉及内存的分配和内存回收的相关代码,此处引用一句话: Java和C++之间存在一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外的人想进去,墙里面的人想出来 ,个人从这 ...