Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用scipy.sparse.linalg中的SVD按降序排序的奇异值_Python_Scipy_Sparse Matrix_Svd - Fatal编程技术网

Python 使用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

我正在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.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, :]