use*_*497 3 python scipy sparse-matrix svd
我正在将 SVD 应用于 Python 中的大型稀疏矩阵。我正在使用 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')
Run Code Online (Sandbox Code Playgroud)
我尝试过sparsesvd python 库。与样本矩阵上的 svd 相比,sparpesvd 的运行时间要长得多。所以我不考虑使用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, :]
Run Code Online (Sandbox Code Playgroud)
这非常简单(正如 pv 在他的评论中给出的那样),但诀窍不是重新排列完整的矩阵,而只是重新排列相关的行/列。当然,任何排列都可以,所以一般来说(perm是排列向量):
u[:,:n] = u[:, perm]
s = s[perm]
vt[:n, :] = vt[perm, :]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5025 次 |
| 最近记录: |