Python实现两种稀疏矩阵的最小二乘法

 更新时间:2023年02月26日 08:55:12   作者:微小冷  
这篇文章主要为大家详细介绍了Python实现的两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr更快收敛,感兴趣的可以了解一下

最小二乘法

scipy.sparse.linalg实现了两种稀疏矩阵最小二乘法lsqr和lsmr,前者是经典算法,后者来自斯坦福优化实验室,据称可以比lsqr更快收敛。

这两个函数可以求解Ax=b,或arg minx ∥Ax−b∥2,或arg minx ∥Ax−b∥2 +d2∥x−x0∥2,其中A必须是方阵或三角阵,可以有任意秩。

通过设置容忍度at ,bt,可以控制算法精度,记r=b-A为残差向量,如果Ax=b是相容的,lsqr在∥r∥⩽at∗∥A∥⋅∥x∥+bt∥b∥时终止;否则将在∥ATr∥⩽at∥A∥⋅∥r∥。

如果两个容忍度都是10−6 ,最终的∥r∥将有6位精度。

lsmr的参数如下

lsmr(A, b, damp=0.0, atol=1e-06, btol=1e-06, conlim=100000000.0, maxiter=None, show=False, x0=None)

参数解释:

  • A 可谓稀疏矩阵、数组以及线性算子
  • b 为数组
  • damp 阻尼系数,默认为0
  • atol, btol 截止容忍度,是lsqr迭代的停止条件,即at ,bt 。
  • conlim 另一个截止条件,对于最小二乘问题,conlim应该小于108,如果Ax=b是相容的,则conlim最大可以设到1012
  • iter_limint 迭代次数
  • show 如果为True,则打印运算过程
  • calc_var 是否估计(A.T@A + damp**2*I)^{-1}的对角线
  • x0 阻尼系数相关

lsqr和lsmr相比,没有maxiter参数,但多了iter_lim, calc_va参数。

上述参数中,damp为阻尼系数,当其不为0时,记作δ,待解决的最小二乘问题变为

返回值

lsmr的返回值依次为:

  • x 即Ax=b中的x
  • istop 程序结束运行的原因
  • itn 迭代次数
  • normr ∥b−Ax
  • normar ∥AT (b−Ax)∥
  • norma ∥A∥
  • conda A的条件数
  • normx ∥x∥

lsqr的返回值为

  1. x 即Ax=b中的x
  2. istop 程序结束运行的原因
  3. itn 迭代次数
  4. r1norm
  5. anorm 估计的Frobenius范数Aˉ
  6. acond Aˉ的条件数
  7. arnorm ∥ATr−δ2(x−x0)∥
  8. xnorm ∥x∥
  9. var (ATA)−1

二者的返回值较多,而且除了前四个之外,剩下的意义不同,调用时且须注意。

测试

下面对这两种算法进行验证,第一步就得先有一个稀疏矩阵

import numpy as np
from scipy.sparse import csr_array

np.random.seed(42)  # 设置随机数状态
mat = np.random.rand(500,500)
mat[mat<0.9] = 0
csr = csr_array(mat)

然后用这个稀疏矩阵乘以一个x,得到b

xs = np.arange(500)
b = mat @ xs

接下来对这两个最小二乘函数进行测试

from scipy.sparse.linalg import lsmr, lsqr
import matplotlib.pyplot as plt
mx = lsmr(csr, b)[0]
qx = lsqr(csr, b)[0]
plt.plot(xs, lw=0.5)
plt.plot(mx, lw=0, marker='*', label="lsmr")
plt.plot(qx, lw=0, marker='.', label="lsqr")
plt.legend()
plt.show()

为了对比清晰,对图像进行放大,可以说二者不分胜负

接下来比较二者的效率,500 × 500 500\times500500×500这个尺寸显然已经不合适了,用2000×2000

from timeit import timeit

np.random.seed(42)  # 设置随机数状态
mat = np.random.rand(500,500)
mat[mat<0.9] = 0
csr = csr_array(mat)
timeit(lambda : lsmr(csr, b), number=10)
timeit(lambda : lsqr(csr, b), number=10)

测试结果如下

>>> timeit(lambda : lsqr(csr, b), number=10)
0.5240591000001587
>>> timeit(lambda : lsmr(csr, b), number=10)
0.6156221000019286

看来lsmr并没有更快,看来斯坦福也不靠谱(滑稽)。

以上就是Python实现两种稀疏矩阵的最小二乘法的详细内容,更多关于Python稀疏矩阵最小二乘法的资料请关注脚本之家其它相关文章!

相关文章

  • 关于对python中进程的几个概念理解

    关于对python中进程的几个概念理解

    进程由程序,数据和进程控制块组成,是正在执行的程,程序的一次执行过程,是资源调度的基本单位,下面这篇文章主要给大家介绍了关于对python中进程的几个概念理解,需要的朋友可以参考下
    2021-10-10
  • Python时间戳与日期格式之间相互转化的详细教程

    Python时间戳与日期格式之间相互转化的详细教程

    java默认精度是毫秒级别的,生成的时间戳是13位,而python默认是10位的,精度是秒,下面这篇文章主要给大家介绍了关于Python时间戳与日期格式之间相互转化的相关资料,需要的朋友可以参考下
    2022-08-08
  • 简单介绍Python中的len()函数的使用

    简单介绍Python中的len()函数的使用

    这篇文章主要简单介绍了Python中的len()函数的使用,包括在四种情况下的使用小例子,是Python学习当中的基础知识,需要的朋友可以参考下
    2015-04-04
  • python判断所输入的任意一个正整数是否为素数的两种方法

    python判断所输入的任意一个正整数是否为素数的两种方法

    今天小编就为大家分享一篇python判断所输入的任意一个正整数是否为素数的两种方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python协程的实现方式小结

    Python协程的实现方式小结

    协程是Python中强大的并发编程工具,允许开发者编写异步代码以提高程序的性能和效率,在本文中,我们将深入探讨Python中协程的实现方式,包括生成器、asyncio库和async/await关键字,我们还会提供详细的示例代码,帮助您理解和应用协程,需要的朋友可以参考下
    2023-11-11
  • Python搭建代理IP池实现获取IP的方法

    Python搭建代理IP池实现获取IP的方法

    这篇文章主要介绍了Python搭建代理IP池实现获取IP的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题

    Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题

    这篇文章主要介绍了Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • python小技巧之批量抓取美女图片

    python小技巧之批量抓取美女图片

    学了python以后,知道python的抓取功能其实是非常强大的,当然不能浪费,呵呵。我平时很喜欢美女图,呵呵,程序员很苦闷的,看看美女,养养眼,增加点乐趣。好,那就用python写一个美女图自动抓取程序吧~~
    2014-06-06
  • Pycharm配置远程SSH服务器实现(切换不同虚拟环境)

    Pycharm配置远程SSH服务器实现(切换不同虚拟环境)

    本文主要介绍了Pycharm配置远程SSH服务器实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python文件比较示例分享

    python文件比较示例分享

    本文介绍了Python比较两个文本文件内容,如果不同, 给出第一个不同处的行号和列号,大家参考使用吧
    2014-01-01

最新评论