Python 使用scipy.sparse.linalg中的SVD按降序排序的奇异值
我正在Python中将SVD应用于一个大型稀疏矩阵。我正在使用scipy.sparse.linalg包中的SVD。奇异值按升序排序,因此奇异向量与升序奇异值相对应。我想知道是否有一个选项以降序输出奇异值,以便奇异向量也与降序奇异值对应排列?下面只是一个示例代码:Python 使用scipy.sparse.linalg中的SVD按降序排序的奇异值,python,scipy,sparse-matrix,svd,Python,Scipy,Sparse Matrix,Svd,我正在Python中将SVD应用于一个大型稀疏矩阵。我正在使用scipy.sparse.linalg包中的SVD。奇异值按升序排序,因此奇异向量与升序奇异值相对应。我想知道是否有一个选项以降序输出奇异值,以便奇异向量也与降序奇异值对应排列?下面只是一个示例代码: from scipy.sparse.linalg import svds from scipy import sparse X = numpy.random.uniform(size = [40, 20]) X = scipy.spar
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库。与样本矩阵上的SVD相比,sparsesvd的运行时间要长得多。所以我没有考虑使用sparsesvd。scipy中的常规svd包不适用于稀疏矩阵。谢谢大家! 您现在正在查找10个最大的奇异值,并按升序接收它们以及左、右奇异向量。如果需要n个最小值,只需将
which
关键字更改为SM
但是,我知道您收到了正确的奇异值,但顺序错误。函数中没有开关可以这样做,但是向量和值可以按照以下规则重新排列:u的前n列和vt的前n行必须保持与奇异值相同的顺序
因此,反转奇异值:
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
是置换向量):
您是在尝试计算最小奇异值,还是以不同的顺序输出N个较大的奇异向量?如果是后者,则
u=u[:,:-1];s=s[:-1];vt=vt[::-1,:]
(或类似的东西)应该足够了。
u[:,:n] = u[:, perm]
s = s[perm]
vt[:n, :] = vt[perm, :]