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

您所在的位置:网站首页 稀疏矩阵的逆矩阵还是稀疏矩阵吗 【Python】scipy稀疏矩阵的奇异值分解svds

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

2024-07-17 11:26| 来源: 网络整理| 查看: 265

文章目录 基本原理scipy实现测试

基本原理

当 A A A是方阵时,可以很容易地进行特征分解: A = W Σ W − 1 A=W\Sigma W^{-1} A=WΣW−1,其中 Σ \Sigma Σ是 A A A的特征值组成的对角矩阵。如果 W W W由标准正交基组成,则 W − 1 = W T W^{-1}=W^T W−1=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)−1ncv solver='arpack'时,此为Lanczos向量个数,否则此项忽略。tol 奇异值容忍度,为0表示达到机器的精度which 为'LM'时,选取最大的奇异值;'SM'则选取最小奇异值v0 迭代初值maxiter 迭代次数return_singular_vectors 可选4个值 True 返回奇异向量False 不返回奇异向量"u": 如果M N,只计算右奇异向量;如果 solver='propack',这个选项将忽略矩阵维度 solver 可选'arpack', 'propack', 'lobpcg',但比较吊诡的是,似乎并没有关于这三者区别的文档random_state 设置随机数状态optionsdict 求解器参数

其返回值有三

u 即 U U Us 即奇异值数组,也就是 Σ \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>> from timeit import timeit >>> timeit(lambda : svds(csc, k=499), number=10) 3.651770199999987 >>> timeit(lambda : svd(mat), number=10) 0.47201400000005833

可见,稀疏矩阵在计算上的确是比不上规整的矩阵。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3