奇异值使用scipy.sparse.linalg中的svds按降序排序

时间:2014-06-30 20:59:25

标签: python scipy sparse-matrix svd

我将SVD应用于Python中的大型稀疏矩阵。我正在使用scipy.sparse.linalg包中的svds。奇异值从升序排序,因此奇异向量对应于递增的奇异值排列。我想知道是否有一个选项以降序输出奇异值,以便奇异向量也对应于下降奇异值排列?以下是示例代码:

from scipy.sparse.linalg import svds
from scipy import sparse
X = numpy.random.uniform(size = [40, 20])
X = scipy.sparse.csc_matrix(X)
u, s, vt = svds(X, 10, which = 'LM')

我试过sparsesvd python库。与样本矩阵上的svds相比,sparsesvd的运行时间要长得多。所以我不考虑使用sparsesvd。 scipy中的常规svd包对稀疏矩阵不起作用。谢谢!

1 个答案:

答案 0 :(得分:2)

您现在正在寻找10个最大的奇异值,并按升序和左右奇异向量接收它们。如果您想要n个最小值,只需将which关键字更改为SM

但是,我知道你会收到正确的奇异值,但顺序错误。函数中没有开关,但是可以使用以下规则重新排列向量和值: u的前n列和前n行的vt必须保持与奇异值

所以,扭转奇异值:

n = len(s)
# reverse the n first columns of u
u[:,:n] = u[:, n-1::-1]
# reverse s
s = s[::-1]
# reverse the n first rows of vt
vt[:n, :] = vt[n-1::-1, :]

这很简单(在他的评论中也由pv给出),但诀窍不是重新排列完整的矩阵,只是相关的行/列。当然,任何排列都可以,所以一般来说(perm是排列向量):

u[:,:n] = u[:, perm]
s = s[perm]
vt[:n, :] = vt[perm, :]