【问题标题】:largest singular value NumPy `ndarray`最大奇异值 NumPy `ndarray`
【发布时间】:2017-02-19 22:18:44
【问题描述】:

我有一个大的二维ndarrayA,我想计算 SVD 以检索最大特征值和相关的特征向量对。查看 NumPy 文档,似乎 NumPy 只能计算完整的 SVD(numpy.linalg.svd),而 SciPy 的方法可以完全满足我的需要(scipy.sparse.linalg.svds),但是矩阵稀疏,我不想执行转换A,因为它需要额外的计算时间。

到目前为止,我一直在 A 上直接使用 SciPy svds,但是文档不鼓励将 ndarrays 传递给这些方法。

有没有办法使用接受ndarray 对象的方法来执行此任务?

【问题讨论】:

    标签: python numpy scipy svd


    【解决方案1】:

    如果 svds 与密集的 A 数组一起使用,则继续使用它。你不需要把它转换成任何东西。 svds 做了它需要的所有适配。

    它的文档说

    A : {稀疏矩阵,LinearOperator} 用于计算形状为 (M, N) 的 SVD 的数组

    但是LinearOperator 是什么?它是可以执行矩阵乘积的东西的包装器。对于密集数组 A.dot 符合条件。

    查看svds 的代码。如果A 还不是线性运算符或稀疏矩阵,那么第一件事就是A = np.asarray(A)。然后它抓取A.dot(hemetianA).dot 并创建一个新的LinearOperator。

    这个函数中的稀疏矩阵没有什么特别之处。重要的是拥有兼容的矩阵产品。

    看看这些时间:

    In [358]: A=np.eye(10)
    In [359]: Alg=splg.aslinearoperator(A)
    In [360]: Am=sparse.csr_matrix(A)
    In [361]: timeit splg.svds(A)
    1000 loops, best of 3: 541 µs per loop
    In [362]: timeit splg.svds(Alg)
    1000 loops, best of 3: 964 µs per loop
    In [363]: timeit splg.svds(Am)
    1000 loops, best of 3: 939 µs per loop
    

    直接使用A 是最快的。即使在时间循环之外,转换也无济于事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-06
      • 2019-04-27
      • 1970-01-01
      • 2018-10-10
      • 2015-07-31
      • 2023-03-29
      • 1970-01-01
      • 2012-08-31
      相关资源
      最近更新 更多