SciPy 和 Numpy 都内置了奇异值分解 (SVD) 函数。命令基本上是
scipy.linalg.svd
和 numpy.linalg.svd
。这两者有什么区别?他们中的任何一个比另一个更好吗?
另一个区别是
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
的计算速度更快,但当您需要计算 np.linalg.svd
时,
svd
可能会更快(或至少更方便)在大型数据数组上。
在输入矩阵非正半定的情况下,查看 win 和 Linux 之间的平台差异。 SVD 在那里并不唯一,它显示 U 矩阵在某些列上切换了符号。