Ax = b 的迭代解法 —— 共轭梯度 (算法步骤)
线性方程组 Ax =b 除了高斯消元法以外,还有其它的迭代解法,这里我们说的是共轭梯度法。
这里只针对 A 满足 对称 ( ), 正定(即
),并且是实系数的,那么我们可以用 梯度下降 和 共轭梯度 来解线性方程组 :
向量 和
是共轭的 (相对于A )如果满足:

下图两两向量都是针对所在梯度处的矩阵‘共轭’的:

把梯度变换一下,就可以看出‘共轭’其实也就是某种正交:

=============================================
共轭梯度法解:
算法步骤:(from wiki)

---------------------------------------------
python代码:(源于:Baselines:https://github.com/openai/baselines(强化学习算法))
import numpy as np
"""共轭梯度下降"""
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
测试代码:
import numpy as np
from gg import cg #导入 共轭梯度函数 cg """
A = np.array([[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0]])
"""
A = np.random.rand(3, 3) # 保证子行列式均为正
A = np.dot(A.T, A) # 生成对称矩阵 def f_Ax(p):
"""f_Ax: 输入变量p为列向量,返回变量为矩阵A矩阵乘以向量p"""
return np.dot(A, p) x = np.random.rand(3)
b = np.dot(A, x)
print("matrix: \n", A)
print("x: \n", x)
print("b: \n", b)
print("...........................") print("显示计算过程:")
result = cg(f_Ax, b, verbose=True)
print("matrix A 的特征值:")
print(np.linalg.eig(A)[0])
print("实际x:")
print(x)
print("求得x:")
print(result)
结果:
matrix:
[[1.33507088 0.69389736 0.579944 ]
[0.69389736 0.76303172 0.47845562]
[0.579944 0.47845562 0.41679907]]
x:
[0.40139385 0.12481318 0.38628268]
b:
[0.84651911 0.55858167 0.45350579]
...........................
显示计算过程:
iter residual norm soln norm
0 1.23 0
1 0.000553 0.523
2 0.000169 0.535
3 4.11e-28 0.571
matrix A 的特征值:
[2.12734118 0.31861571 0.06894478]
实际x:
[0.40139385 0.12481318 0.38628268]
求得x:
[0.40139385 0.12481318 0.38628268]
=============================================
参考:
图来源:
------------------------------------------------------------------------------
Ax = b 的迭代解法 —— 共轭梯度 (算法步骤)的更多相关文章
- 共轭梯度算法求最小值-scipy
# coding=utf-8 #共轭梯度算法求最小值 import numpy as np from scipy import optimize def f(x, *args): u, v = x a ...
- 机器学习: 共轭梯度算法(PCG)
今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法.我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法. ...
- 迭代硬阈值类算法总结||IHT/NIHT/CGIHT/HTP
迭代硬阈值类(IHT)算法总结 斜风细雨作小寒,淡烟疏柳媚晴滩.入淮清洛渐漫漫. 雪沫乳花浮午盏,蓼茸蒿笋试春盘.人间有味是清欢. ---- 苏轼 更多精彩内容请关注微信公众号 "优化与算法 ...
- Mahout 系列之----共轭梯度
无预处理共轭梯度 要求解线性方程组 ,稳定双共轭梯度法从初始解 开始按以下步骤迭代: 任意选择向量 使得 ,例如, 对 若 足够精确则退出 预处理共轭梯度 预处理通常被用来加速迭代方法的收敛.要使用预 ...
- 近端梯度算法(Proximal Gradient Descent)
L1正则化是一种常用的获取稀疏解的手段,同时L1范数也是L0范数的松弛范数.求解L1正则化问题最常用的手段就是通过加速近端梯度算法来实现的. 考虑一个这样的问题: minx f(x)+λg(x) x ...
- 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型
import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ...
- ICP(迭代最近点)算法
图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ...
- flink PageRank详解(批量迭代的页面排名算法的基本实现)
1.PageRank算法原理 2.基本数据准备 /** * numPages缺省15个测试页面 * * EDGES表示从一个pageId指向相连的另外一个pageId */ public clas ...
- 3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测、直方图与傅里叶变换
一.图像梯度算法 1.图像梯度-Sobel算子 dst = cv2.Sobel(src, ddepth, dx, dy, ksize) ddepth:图像的深度 dx和dy分别表示水平和竖直方向 ks ...
- MD5算法步骤详解
转自MD5算法步骤详解 之前要写一个MD5程序,但是从网络上看到的资料基本上一样,只是讲了一个大概.经过我自己的实践,我决定写一个心得,给需要实现MD5,但又不要求很高深的编程知识的童鞋参考.不多说了 ...
随机推荐
- 5 分钟小工具:使用 dive 分析 docker 镜像
需求 拿到一个镜像之后,我想知道: 分层查看镜像里都有哪些文件 各层使用了什么命令构建的这个镜像 镜像里比较大的文件有哪些(可能需要优化) dive 工具介绍 dive 工具可以做这些分析.dive ...
- 太卷了,史上最简单的监控系统 catpaw 简介
指标监控的痛点 当下比较流行的监控系统,比如 Prometheus.Nightingale.VictoriaMetrics,都是基于数值型指标的监控系统,这类监控系统的痛点在于:告警的时候只能拿到异常 ...
- Vue学习:7.计算属性2
上一节了解的是计算属性的默认简写,只能读取,不能修改. 什么意思呢?很简单,我们知道计算属性是依赖数据动态计算一个值,那我可不可以直接this.计算属性 = xxx 来修改计算属性的结果呢?这其实是不 ...
- uni-app apple store 上传新版本审核被拒绝 Guideline 5.1.1
- Legal - Privacy - Data Collection and Storage We noticed that your app requests the user's consent ...
- IDEA安装配置
1.安装IDEA选择免费体验 2.下载对应版本的破解补丁 agent.jar -2.1 将agent.jar补丁和important.txt放置到idea安装目录 3.修改VMoption javaa ...
- .NET Core WebApi接口ip限流实践
.NET Core WebApi接口ip限流实践 前言 之前一直想实现接口限流,但一直没去实现,然后刚好看到一篇文章是基于AspNetCoreRateLimit 组件的限流策略.这个组件不做多的介绍, ...
- Linux内核:通知链 机制
Linux内核:通知链 机制 背景 在驱动分析中经常看到fb_notifier_callback,现在趁有空学习一下. 参考: https://www.cnblogs.com/armlinux/arc ...
- 执行insmod提示 invalid module format
内核版本和驱动版本不匹配: 1.假如内核版本是2018.3,驱动使用了另外一个版本,可能会出现这样的问题 2.内核和驱动版本一致,但内核进行了一些配置,导致驱动装不上,此时应该: make clean ...
- 设备树DTS 学习: 4-uboot 传递 dtb 给 内核
背景 得到 dtb 文件以后,我们需要想办法下载到 板子中,并给 Linux 内核使用. (高级版本的 uboot也有了 自己使用设备树支持,我们这里不讨论 uboot 使用的设备树) Linux 内 ...
- bs4解析-优美图库
import requests from bs4 import BeautifulSoup url = 'http://www.umeituku.com/bizhitupian/meinvbizhi/ ...