python版本的“共轭梯度法”算法代码
在看代码的过程中遇到了共轭梯度法这个概念,对这个算法的数学解释看过几遍,推导看过了,感觉懂了,然后过上一些日子就又忘记了,然后又看了一遍推导,然后过了一些日子也就又忘记了,最后想想这个算法的数学解释就不要再取深究了,毕竟平时也不太会用到,偶尔用到了只要保证代码会写也就OK了。
相关资料推荐:
https://jonathan-hui.medium.com/rl-conjugate-gradient-5a644459137a
==========================================
共轭梯度法(英语:Conjugate gradient method),是求解系数矩阵为对称正定矩阵的线性方程组的数值解的方法。共轭梯度法是一个迭代方法,它适用于系数矩阵为稀疏矩阵的线性方程组,因为使用像Cholesky分解这样的直接方法求解这些系统所需的计算量太大了。这种方程组在数值求解偏微分方程时很常见。
共轭梯度法也可以用于求解无约束的最优化问题。
双共轭梯度法(英语:BiConjugate gradient method)提供了一种处理非对称矩阵情况的推广。

------------------------------------------------------------------------------
个人感觉这个共轭梯度法虽然是求近似解,但是其计算速度快,因此比较实用。不过需要注意的是这里的A是实对称正定矩阵。
给出python代码:
import numpy as np def conjugate_gradient(A, b, cg_iters=10, residual_tol=1e-10):
assert isinstance(A, np.ndarray)
assert isinstance(b, np.ndarray) r = np.copy(b)
p = np.copy(b) x = np.zeros_like(b)
rdotr = np.dot(r, r) for i in range(cg_iters):
z = np.dot(A, p)
v = rdotr / np.dot(p, z)
x += v * p
r -= v * z
newrdotr = np.dot(r, r)
mu = newrdotr / rdotr
p = r + mu * p rdotr = newrdotr
if rdotr < residual_tol:
break return x if __name__ == '__main__':
M = np.random.rand(9).reshape((3, 3))
A = np.dot(M.T, M) b = np.random.rand(3) x = conjugate_gradient(A, b) x_ = np.dot(np.linalg.inv(A), b) print("conjugate_gradient:")
print(x) print() print("np.linalg.inv:")
print(x_)
print(np.sqrt(np.mean(np.square(x - x_))))

------------------------------------------------------------------------------

----------------------------------------------------------------------------
参考:
https://zh.wikipedia.org/wiki/%E5%85%B1%E8%BD%AD%E6%A2%AF%E5%BA%A6%E6%B3%95
python版本的“共轭梯度法”算法代码的更多相关文章
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
- 【PYTHON】a-start寻路算法
本文章适合黄金段位的LOL大神,同样更适合出门在外没有导航,就找不到家的孩子. 在英雄联盟之中,当你和你的队友都苦苦修炼到十八级的时候,仍然与敌方阵营不分胜负,就在你刚买好装备已经神装的时候,你看见信 ...
- 二叉树的python可视化和常用操作代码
二叉树是一个重要的数据结构, 本文基于"二叉查找树"的python可视化 pybst 包, 做了一些改造, 可以支持更一般的"二叉树"可视化. 关于二叉树和二叉 ...
- 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...
- 机器学习三 -- 用Python实现K-近邻算法
Python语言实现机器学习的K-近邻算法 写在前面 额...最近开始学习机器学习嘛,网上找到一本关于机器学习的书籍,名字叫做<机器学习实战>.很巧的是,这本书里的算法是用Python语言 ...
- python版本及ML库
一:关于Python版本的选择问题 关于Python的选择问题:要看学术界能不能把科学库迁移到Python3. 1:多个版本共用: 最近发现SciPy的最高版本是3.2,只能是退而求其次,不使用最新版 ...
- 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)
稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...
- KMP算法代码
以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码 ...
- Linux安装多个Python版本
服务器上的Python版本太老了,需要安装一个新的Python版本,才能跑我的代码.因为环境的需要,但是又不能卸载老的版本,所以安装一个新的,使用软链来进行升级. 使用系统自带的yum,apt-get ...
随机推荐
- 《Android开发卷——自定义日期选择器(三)》
继 <Android开发卷--自定义日期选择器(一)>:http://blog.csdn.net/chillax_li/article/details/19047 ...
- C++操作符重载(operator)
c++操作符 例如-=+*/等,甚至包括,<<等都是操作符.c++特色之一就是给予完全重构和重载操作符(Java不可以,c#操作部分). 例子入手 假设一个结构体,定义如下 struct ...
- Lfu缓存在Rust中的实现及源码解析
一个 lfu(least frequently used/最不经常使用页置换算法 ) 缓存的实现,其核心思想是淘汰一段时间内被访问次数最少的数据项.与LRU(最近最少使用)算法不同,LFU更侧重于数据 ...
- 在WPF中使用WriteableBitmap对接工业相机及常用操作
写作背景 写这篇文章主要是因为工业相机(海康.大恒等)提供的.NET开发文档和示例程序都是用WinForm项目来说明举例的,而在WPF项目中对图像的使用和处理与在WinForm项目中有很大不同.在Wi ...
- Unity 中使用Geomotry Shader(几何着色器)扩展点创建其他图形(并实现处理锯齿)
问题背景: 我们开发中需要有"点"对象,可以是像素的(不具备透视效果),始终等大,还有就是3D场景下的矢量点(随相机距离透视变化的). 问题解决思路: 方案1:使用GS扩充顶点,并 ...
- 【ClickHouse】0:clickhouse学习4之表相关操作
Clickhouse对表操作分为四大类:增删查改(INSERT,DROP,SELECT,ALTER). 增,删,查比较简单,改最复杂.那具体有哪些改的操作呢?如下清单: ALTER ALTER TAB ...
- P5494 题解
来一发 \(O(\log n)\) 线性空间的解法. 考虑通过只维护线段树叶子节点的虚树的方法压缩空间,考虑记录下每个节点的编号,然后通过异或完求最低位的 \(1\) 的方式求出 LCA 的深度,然后 ...
- 树莓派4B-控制霍尔编码器
霍尔编码器-直流减速电机 介绍 直流减速电机,即齿轮减速电机,是在普通直流电机的基础上,加上配套齿轮减速箱.齿轮减速箱的作用是,提供较低的转速,较大的力矩.同时,齿轮箱不同的减速比可以提供不同的转速和 ...
- position的值, relative和absolute分别是相对于谁进行定位的?
relative: 相对定位,相对于自己本身在正常文档流中的位置进行定位 相对它原来的位置,在走100px.原来在标准流中的位置继续占有. absolute: 生成绝对定位,相对于最近一级定位不为s ...
- 洛谷P1004
洛谷P1004方格取数 题目大意 本题简要意思就是一个人从一个数字矩阵的左上角走到右下角,只能向下和向右走,拿完的数对应位置变成0,并且这个人要走两次,需要计算两次所拿数的最大值 Train of t ...