SciPy SVD与Numpy SVD

qlvxas9a  于 2023-06-29  发布在  其他
关注(0)|答案(3)|浏览(120)

SciPy和Numpy都内置了用于奇异值分解(SVD)的函数。命令基本上是scipy.linalg.svdnumpy.linalg.svd。这两者有什么区别?有哪个比另一个更好吗?

djmepvbi

djmepvbi1#

在FAQ页面上,它说scipy.linalg子模块为Fortran LAPACK库提供了一个更完整的 Package 器,而numpy.linalg试图能够独立于LAPACK进行构建。
我为svd函数的不同实现做了一些benchmarks,发现scipy.linalg.svd比numpy对应的更快:

然而,jax Package 的numpy,又名jax.numpy.linalg.svd甚至更快:

基准测试的完整笔记本可用于here

kyks70gy

kyks70gy2#

除了错误检查之外,实际的工作似乎是在lapack中使用numpyscipy完成的。
在没有做任何基准测试的情况下,我猜性能应该是相同的。

zed5wv10

zed5wv103#

另一个区别是np.linalg.svd可以在大型数据数组上进行向量化的svd计算,其中sp.linalg.svd一次只做1。
例如:

import numpy as np
import scipy as sp

data = np.random.random((3,3))             # a single matrix
data_array = np.random.random((10**6,3,3)) # one million matrices

# numpy svd
R,S,V = np.linalg.svd(data)       # works
R,S,V = np.linalg.svd(data_array) # works

# scipy svd
R,S,V = sp.linalg.svd(data)       # works
R,S,V = sp.linalg.svd(data_array) # fails !!!

我还没有对此进行基准测试,但两者之间的直接1:1比较可能会显示sp.linalg.svd的计算速度更快,而当您需要在大型数据数组上计算svd时,np.linalg.svd可能更快(或至少更方便)。

相关问题