【问题标题】:Sparse eigenvalues : scipy.sparse.linalg.eigs is slower than scipy.linalg.eigvals稀疏特征值:scipy.sparse.linalg.eigs 比 scipy.linalg.eigvals 慢
【发布时间】:2017-08-14 17:27:34
【问题描述】:

我有一个奇怪的现象,虽然scipy.sparse.linalg.eigs 对于稀疏矩阵应该更快,但我知道它比scipy 的正常eigvals 方法运行得慢:

In [4]: %timeit m.calc_pde_numerical_jacobian(m.initial_state)
10 loops, best of 3: 41.2 ms per loop

In [5]: %timeit m.calc_pde_analytic_jacobian(m.initial_state)
1000 loops, best of 3: 1.42 ms per loop

In [6]: %timeit m.calc_analytic_pde_eigs(m.initial_state)
1 loop, best of 3: 374 ms per loop

In [7]: %timeit m.calc_numeric_pde_eigs(m.initial_state)
1 loop, best of 3: 256 ms per loop 

所以方法calc_pde_numerical_jacobian 构造了我的方程组的雅可比矩阵的密集矩阵,而calc_pde_analytic_jacobian 正在解析地构造雅可比矩阵的稀疏矩阵(csc 格式)。虽然解析方法在构造雅可比矩阵的稀疏矩阵时工作得更快,但当使用 scipy 的特征值查找方法时,稀疏矩阵特征值方法较慢。我用来计算特征值的函数如下:

def calc_numeric_pde_eigs(self,state):
    return linalg.eigvals(self.calc_pde_numerical_jacobian(state))
def calc_analytic_pde_eigs(self,state):
    return sparse.linalg.eigs(self.calc_pde_analytic_jacobian(state),k=6,which='LR',return_eigenvectors=False)

有人知道这是怎么发生的吗?

【问题讨论】:

  • 矩阵的大小是多少?
  • 当前矩阵的大小为512x512
  • 对于带宽较小的稀疏矩阵情况更糟

标签: python numpy scipy sparse-matrix eigenvalue


【解决方案1】:

对于足够大和稀疏的矩阵,稀疏求解器应该更快。我为 N in range(150, 550, 50) 和 N = 1000 运行了以下 sn-p:

In [150]: from scipy import sparse

In [151]: from scipy import linalg

[...]

In [186]: N = 150

In [187]: m = sparse.random(N, N, density=0.05).tocsc()

In [188]: a = m.A

In [189]: %timeit sparse.linalg.eigs(m, k=6, which='LR', return_eigenvectors=False)
10 loops, best of 3: 20.2 ms per loop

In [190]: %timeit linalg.eigvals(a)
100 loops, best of 3: 9.66 ms per loop

并得到以下时间(以毫秒为单位):

N                    150   200   250   300   350   400   450   500   1000
sparse.linalg.eig   20.2  22.2  28.9  29.4  48.5  38.6  75.2   57.9   152
linalg.eigvals       9.7  17.0  24.5  37.0  52.7  63.3  82.5  105     482

在这种情况下,稀疏求解器变得有竞争力的大小是 250-300。

时间可能取决于稀疏性(即矩阵的非零百分比)以及非零元素的结构或模式。对于您的问题,在矩阵大于 512x512 之前,稀疏求解器可能不会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2015-07-23
    • 2014-09-23
    • 2015-08-27
    • 2012-08-20
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多