【Python】scipy稀疏矩阵的奇异值分解svds

这篇具有很好参考价值的文章主要介绍了【Python】scipy稀疏矩阵的奇异值分解svds。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基本原理

A A A是方阵时,可以很容易地进行特征分解: A = W Σ W − 1 A=W\Sigma W^{-1} A=WΣW1,其中 Σ \Sigma Σ A A A的特征值组成的对角矩阵。如果 W W W由标准正交基组成,则 W − 1 = W T W^{-1}=W^T W1=WT,特征分解可进一步写成 W T Σ W W^T\Sigma W WTΣW

然而,当 A A A不是方阵时,情况大不一样了,但仍然可以将 A A A表示成 A = U Σ V T A=U\Sigma V^T A=UΣVT的形式,其中 Σ \Sigma Σ也是对角矩阵,对角线上的每个元素被称作奇异值。

奇异值的求解过程和特征值息息相关,因为把 A A A变成方阵很简单,只要乘以转置就行。故令 L = A A T L=AA^T L=AAT R = A T A R=A^TA R=ATA,则 L , R L, R L,R都可以求特征值 λ i \lambda_i λi和特征向量,其中 L L L的特征向量为 A A A的左奇异向量, R R R的特征向量为右奇异向量。对应的奇异值 σ i = λ i \sigma_i=\sqrt{\lambda_i} σi=λi

scipy实现

scipy.sparse.linalg中实现了稀疏矩阵奇异值分解算法,其参数列表如下

svds(A, k=6, ncv=None, tol=0, which='LM', v0=None, maxiter=None, return_singular_vectors=True, solver='arpack', random_state=None, options=None)

各参数含义如下

  • A 待分解矩阵
  • k 奇异值个数,必须在 [ k , k max ⁡ ] [k, k_{\max}] [k,kmax]之间, 当solver='propack'时, k m a x = min ⁡ ( M , N ) k_{max}=\min(M,N) kmax=min(M,N),否则 k m a x = min ⁡ ( M , N ) − 1 k_{max}=\min(M,N)-1 kmax=min(M,N)1
  • ncv solver='arpack'时,此为Lanczos向量个数,否则此项忽略。
  • tol 奇异值容忍度,为0表示达到机器的精度
  • which'LM'时,选取最大的奇异值;'SM'则选取最小奇异值
  • v0 迭代初值
  • maxiter 迭代次数
  • return_singular_vectors 可选4个值
    • True 返回奇异向量
    • False 不返回奇异向量
    • "u": 如果M <= N,只计算左奇异向量
    • "vh": 如果M > N,只计算右奇异向量;如果 solver='propack',这个选项将忽略矩阵维度
  • solver 可选'arpack', 'propack', 'lobpcg',但比较吊诡的是,似乎并没有关于这三者区别的文档
  • random_state 设置随机数状态
  • optionsdict 求解器参数

其返回值有三

  • u 即 U U U
  • s 即奇异值数组,也就是 Σ \Sigma Σ的对角线
  • vh 即 V T V^T VT

测试

下面对奇异值分解做个测试

import numpy as np
from scipy.linalg import svd
from scipy.sparse import csc_array
from scipy.sparse.linalg import svds
np.random.seed(42)  # 设置随机数状态
mat = np.random.rand(500,800)
mat[mat<0.9] = 0
csc = csc_array(mat)
u1, s1, vh1 = svds(csc, k=10)
u2, s2, vh2 = svd(mat)

结果是svds得到的结果和svd的前十个值完全相同,只是排序不一样,但也无关紧要。

下面测试一下二者的时间,由于在Windows下用不了propack,所以svds计算的奇异值数最多只能是 M − 1 M-1 M1,也就是499,所以只能测试这个和svd返回500个奇异值的结果相比对,结果如下

>>> from timeit import timeit
>>> timeit(lambda : svds(csc, k=499), number=10)
3.651770199999987
>>> timeit(lambda : svd(mat), number=10)
0.47201400000005833

可见,稀疏矩阵在计算上的确是比不上规整的矩阵。文章来源地址https://www.toymoban.com/news/detail-650933.html

到了这里,关于【Python】scipy稀疏矩阵的奇异值分解svds的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 奇异矩阵报错处理numpy.linalg.LinAlgError: singular matrix

    奇异矩阵报错处理numpy.linalg.LinAlgError: singular matrix

    奇异矩阵出现的原因是因为出现了相同的一行或者一列 numpy.linalg.LinAlgError: singular matrix报错位置在 a数据转置发生了错误,因为a数据在添加数据的时候,添加重复了一列。 或者因为产生了a奇异矩阵,用异常处理语句 try: except:重新处理a矩阵

    2024年02月15日
    浏览(12)
  • Scipy 高级教程——稀疏矩阵

    Scipy 提供了处理稀疏矩阵的工具,这对于处理大规模数据集中的稀疏数据是非常有效的。本篇博客将深入介绍 Scipy 中的稀疏矩阵功能,并通过实例演示如何应用这些工具。 1. 稀疏矩阵的表示 在 Scipy 中,稀疏矩阵可以使用 scipy.sparse 模块进行表示。常用的稀疏矩阵类型有 cs

    2024年01月17日
    浏览(12)
  • 【scipy 基础】--稀疏矩阵

    稀疏矩阵 是一种特殊的矩阵,其非零元素数目远远少于零元素数目,并且非零元素分布没有规律。 这种矩阵在实际应用中经常出现,例如在物理学、图形学和网络通信等领域。 稀疏矩阵 其实也可以和一般的矩阵一样处理,之所以要把它区分开来进行特殊处理,是因为: 一

    2024年02月05日
    浏览(8)
  • 【数学与算法】奇异矩阵、奇异值、奇异值分解、奇异性

    【数学与算法】奇异矩阵、奇异值、奇异值分解、奇异性

    我们经常会碰到几个名词很相近的一些数学术语,例如 奇异矩阵、奇异值、奇异值分解、奇异性 ,经常会混淆,这里把它们的定义放在一起,做一下总结: 1.奇异矩阵: 奇异矩阵 是线性代数的概念,就是该矩阵的 秩不是满秩 。 首先,看这个矩阵是不是方阵,即行数和列数

    2024年02月06日
    浏览(12)
  • 矩阵的奇异值分解

    矩阵的奇异值分解

    注:本博文为本人阅读论文、文章后的原创笔记,未经授权不允许任何转载或商用行为,否则一经发现本人保留追责权利。有问题可留言联系,欢迎指摘批评,共同进步!!! 假设矩阵 A mathbf{A} A 是一个 M × N M times N M × N 大小的矩阵。对其进行奇异值分解后可以得到: A

    2024年02月02日
    浏览(11)
  • Matlab实现矩阵的QR分解和奇异值分解

    Matlab实现矩阵的QR分解和奇异值分解

    1.安装并运行matlab软件; 2.在命令窗口行输入需要进行QR分解的矩阵,并输入求秩及进行QR分解的函数,如下图; 3.点击回车键,则可得Q及R矩阵; 4.若要查看之前所输入的矩阵及所获得的相关变量,可从右侧工作区窗口查看; 5.单击需要查看的变量名,则相关变量会被显示在主窗口

    2024年02月16日
    浏览(9)
  • MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原

    MXNet中图解稀疏矩阵(Sparse Matrix)的压缩与还原

    对于稀疏矩阵的解释,就是当矩阵里面零元素远远多于非零元素,且非零元素没有规律,这样的矩阵就叫做稀疏矩阵,反过来就是稠密矩阵,其中非零元素的数量与所有元素的比值叫做稠密度,一般稠密度小于 0.05 的都叫做稀疏矩阵。 我们知道压缩文件的时候,可以将大文件

    2024年02月05日
    浏览(9)
  • 一分钟读懂:矩阵的特征值分解、奇异值分解和伪逆矩阵

    通过把矩阵运算分解成多个矩阵的乘法,可以简化矩阵运算,也可发现对应线性变换的一些内在规律和特性。根据不同的目的,有不同的分解策略。本文我们讨论最常用的特征值分解和奇异值分解。 定义了矩阵的加、减、乘、除(逆)运算后,数学家们自然希望探索矩阵更多

    2024年02月03日
    浏览(10)
  • 【线性代数/机器学习】矩阵的奇异值与奇异值分解(SVD)

    我们知道,对于一个 n × n ntimes n n × n 的矩阵 A A A ,如果 A A A 有 n n n 个线性无关的特征向量,则 A A A 可以相似对角化,即存在可逆矩阵 P P P 使得 A = P Λ P − 1 A=PLambda P^{-1} A = P Λ P − 1 ,其中 Λ Lambda Λ 是 A A A 的特征值组成的对角阵。 P P P 的列实际上就是 A A A 的特征向

    2024年02月10日
    浏览(9)
  • 矩阵篇(五)-- 特征值分解(EVD)和奇异值分解(SVD)

    矩阵篇(五)-- 特征值分解(EVD)和奇异值分解(SVD)

            设 A n × n A_{n times n} A n × n ​ 有 n n n 个线性无关的特征向量 x 1 , … , x n boldsymbol{x}_{1}, ldots, boldsymbol{x}_{n} x 1 ​ , … , x n ​ ,对应特征值分别为 λ 1 , … , λ n lambda_{1}, ldots, lambda_{n} λ 1 ​ , … , λ n ​ A [ x 1 ⋯ x n ] = [ λ 1 x 1 ⋯ λ n x n ] Aleft[begin{array}{lll

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包