我有一个大的二维ndarray
,A
,我想计算检索最大特征值和相关特征向量对的SVD。查看NumPy文档,似乎NumPy只能计算完整的SVD(numpy.linalg.svd
),而SciPy具有完全满足我需要的方法(scipy.sparse.linalg.svds
),但是矩阵稀疏,我不想执行转换A
的值,因为它将需要额外的计算时间。
到目前为止,我一直在svds
上直接使用SciPy A
,但是文档不鼓励将ndarray
传递给这些方法。
有没有一种方法可以使用接受ndarray
对象的方法来执行此任务?
最佳答案
如果svds
与密集的A
数组一起使用,请继续使用它。您无需将其转换为任何东西。 svds
进行所有需要的调整。
它的文件说
答:{稀疏矩阵,LinearOperator}
用于计算形状(M,N)的SVD的数组
但是什么是LinearOperator
?它是可以执行矩阵乘积的东西的包装。对于密集数组,A.dot
合格。
查看svds
的代码。如果A = np.asarray(A)
还不是线性运算符或稀疏矩阵,则要做的第一件事就是A
。然后,它捕获A.dot
和(hemetianA).dot
并创建一个新的LinearOperator。
在此函数中,稀疏矩阵没有什么特别的。重要的是拥有兼容的矩阵产品。
看一下这些时间:
In [358]: A=np.eye(10)
In [359]: Alg=splg.aslinearoperator(A)
In [360]: Am=sparse.csr_matrix(A)
In [361]: timeit splg.svds(A)
1000 loops, best of 3: 541 µs per loop
In [362]: timeit splg.svds(Alg)
1000 loops, best of 3: 964 µs per loop
In [363]: timeit splg.svds(Am)
1000 loops, best of 3: 939 µs per loop
直接使用
A
最快。转换无济于事,即使它们不在时序循环内。