预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)

给出百度百科上的解释:

预处理共轭梯度法

预处理共轭梯度法是。不必预先估计参数等特点。

共轭梯度法近年来在求解大型稀疏方程组中取得了较好的成效。理论上普通的共扼梯度法对于对称超正定方程,只要迭代步数达到方程的阶数就可以得到精确解,但实际上当系数矩阵的条件数(最大最小特征值之比)很大时,普通的共轭梯度法收敛速度很慢。预处理共轭梯度法对系数矩阵作预处理,以加速迭代收敛速度。

这个预处理共轭梯度算法,适用的环境是“正定的大型稀疏矩阵”,并且系数矩阵的条件数(最大最小特征值之比)很大的情况。

一般在机器学习中,我目前接触的问题中其实并不太会用到这个预处理共轭梯度算法,标准的共轭梯度算法就足以处理大多数的问题了。

共轭梯度法,在之前的博客中已经多次介绍并给出了对应的计算代码,这里就不具体介绍了,这里只讲一下这个预处理。

共轭梯度法,就是求解方程:Ax=b

其中,A矩阵为正定矩阵。

而预处理共轭梯度法,则是对矩阵A进行一个预处理,因为如果A是一个比较大的稀疏矩阵,并且A的系数矩阵的条件数(最大最小特征值之比)很大,那么即使使用共轭梯度法也需要较长的运算时间,因此可以在这种情况下,可以通过对A矩阵进行一个预处理得到等价的B矩阵,即Bx=b,这里的x和Ax=b中的x相同。

给出百度文库上的资料:

预处理共轭梯度法:

PS. 预处理方法有对角线预处理,不完全Cholesky分解预处理等。其目标就是把矩阵转换为矩阵B,并保证Ax=b,Bx=b,并且两者的x相同。这个预处理共轭梯度法更多的是用在物理学领域,在信息学中的应用还是比较有限的,因此只需要做到了解即可,不用强求掌握。

本文并没有找到具体的“预处理共轭梯度”的代码,但是给出了下面相关的资料,所需要者可以根据下面的资料执行实现这个预处理的步骤:


附录:

共轭梯度法,代码:

def cg(f_Ax, b, cg_iters=10, callback=None, verbose=False, residual_tol=1e-10):
"""
Demmel p 312
"""
p = b.copy()
r = b.copy()
x = np.zeros_like(b)
rdotr = r.dot(r) fmtstr = "%10i %10.3g %10.3g"
titlestr = "%10s %10s %10s"
if verbose: print(titlestr % ("iter", "residual norm", "soln norm")) for i in range(cg_iters):
if callback is not None:
callback(x)
if verbose: print(fmtstr % (i, rdotr, np.linalg.norm(x)))
z = f_Ax(p)
v = rdotr / p.dot(z)
x += v * p
r -= v * z
newrdotr = r.dot(r)
mu = newrdotr / rdotr
p = r + mu * p rdotr = newrdotr
if rdotr < residual_tol:
break if callback is not None:
callback(x)
if verbose: print(fmtstr % (i + 1, rdotr, np.linalg.norm(x))) # pylint: disable=W0631
return x

预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)的更多相关文章

  1. 机器学习: 共轭梯度算法(PCG)

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

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

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

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

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

  4. 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换

    一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...

  5. 近端梯度算法(Proximal Gradient Descent)

    L1正则化是一种常用的获取稀疏解的手段,同时L1范数也是L0范数的松弛范数.求解L1正则化问题最常用的手段就是通过加速近端梯度算法来实现的. 考虑一个这样的问题: minx  f(x)+λg(x) x ...

  6. 临近梯度下降算法(Proximal Gradient Method)的推导以及优势

    邻近梯度下降法 对于无约束凸优化问题,当目标函数可微时,可以采用梯度下降法求解:当目标函数不可微时,可以采用次梯度下降法求解:当目标函数中同时包含可微项与不可微项时,常采用邻近梯度下降法求解.上述三种 ...

  7. Mahout系列之----共轭梯度预处理

    对于大型矩阵,预处理是很重要的.常用的预处理方法有: (1) 雅克比预处理 (2)块状雅克比预处理 (3)半LU 分解 (4)超松弛法

  8. 几句话总结一个算法之Policy Gradients

    强化学习与监督学习的区别在于,监督学习的每条样本都有一个独立的label,而强化学习的奖励(label)是有延后性,往往需要等这个回合结束才知道输赢 Policy Gradients(PG)计算某个状 ...

  9. cuda并行编程之求解ConjugateGradient(共轭梯度迭代)丢失dll解决方式

    在进行图像处理过程中,我们常常会用到梯度迭代求解大型线性方程组.今天在用cuda对神秘矩阵进行求解的时候.出现了缺少dll的情况: 报错例如以下图: watermark/2/text/aHR0cDov ...

  10. 蒙特卡罗算法(Monte Carlo method)

    蒙特卡罗方法概述 蒙特卡罗方法又称统计模拟法.随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法.将所求解的问题同一 ...

随机推荐

  1. kettle从入门到精通 第六十三课 ETL之kettle kettle调用python脚本的两种方法

    kettle中不能直接调用python脚本,可以通过shell脚本和http进行调用pyton服务. 一.shell脚本调用python脚本 1.下面是一段简单的无参python脚本 import o ...

  2. 开源一款功能强大的 .NET 消息队列通讯模型框架 Maomi.MQ

    目录 文档说明 导读 快速开始 消息发布者 IMessagePublisher 连接池 消息过期 事务 发送方确认模式 独占模式 消费者 消费者模式 事件模式 分组 消费者模式 消费.重试和补偿 消费 ...

  3. Flarum 安装和使用教程

    随着开源社区的日益繁荣,人们对社区品质的要求也越来越高.传统的 BBS 论坛模式已经难以满足现代用户对美观.便捷.互动性的需求.搭建一个现代化的高品质社区,成为许多网站管理者的迫切需求和共同挑战. 今 ...

  4. 如何使用 Dump 文件?

    引言 本文概述了使用 WinDbg 的一些必要步骤. 准备工作 第一步,你必须更改系统的配置使其能够生成 PDB 文件,包括 Release 版本.近期的 Visual C++ 编译器默认启用此配置, ...

  5. windows server 安装.net framework 3.5失败

    windows server如果高版本的.net framework 那么在安装.net framework3.5时会提示已安装高版本的不能安装低版本的了 ---------------------- ...

  6. 实验六-Salt本地pojie实验

    [实验目的]了解Salt型密码的加密机制,学会使用本地密码pojie工具来pojieSalt型密码,了解pojie密码原理. [知识点]Salt,密码pojie [实验原理] 1.Salt概念 在密码 ...

  7. Linux信号量

    查看信号量 [root@localhost ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) ...

  8. LuBase 低代码开发框架介绍 - 可私有化部署

    框架定位 面向开发人员,针对管理软件领域,对页面交互和通用功能进行高阶封装,逐步打造成平台型.生态型开发工具. 涓涓细流 ,汇聚成海,基于 PBC(组件式开发)开发理念,让功能模块的复用更简单. 让管 ...

  9. arm linux 移植 curl

    背景 libcurl是一个跨平台的开源网络协议库,支持http, https, rtsp等多种协议 .libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, ...

  10. xpath-猪八戒网服务商名称爬取

    import requests from lxml import etree url = 'https://changsha.zbj.com/xcxkfzbjzbj/f.html?fr=zbj.sy. ...