我将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库。与样本矩阵上的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
是置换向量):u[:,:n] = u[:, perm]
s = s[perm]
vt[:n, :] = vt[perm, :]
关于python - 奇异值使用来自scipy.sparse.linalg的svds按降序排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24498854/