我将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包对稀疏矩阵不起作用。谢谢!
答案 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, :]