【问题标题】:Computing N smallest eigenvalues of Sparse Matrix in Python在 Python 中计算稀疏矩阵的 N 个最小特征值
【发布时间】:2012-02-23 08:43:16
【问题描述】:

我想在 Python 中找到稀疏矩阵的 N 个最小特征值。我试过使用scipy.sparse.linalg.eigen.arpack 包,但它在计算最小特征值时非常慢。我在某处读到有移位反转模式,但是当我尝试使用它时,我收到一条错误消息,告诉我还不支持移位反转模式。关于我应该如何进行的任何想法?

【问题讨论】:

    标签: python scipy sparse-matrix eigenvalue


    【解决方案1】:

    SciPy 版本

    scipy.sparse.linalg.eigs from SciPy v0.9 的文档与scipy.sparse.linalg.eigs from SciPy v0.10 的文档进行比较,似乎从 v0.10 开始实现并运行 shift-invert 模式。具体来说,v0.9 文档中对sigma 参数的解释表明它没有实现,但v0.10 文档没有说明是这种情况。

    如果您没有 SciPy v0.10 或更高版本,安装最新版本应该可以让您使用带有稀疏特征求解器的 shift-invert 模式。

    缓慢寻找小幅度特征值

    如问题中所述,可以使用 ARPACK 接口查找小幅度特征值。这是通过在调用scipy.sparse.linalg.eigs 时传递which='SM' 来完成的。但是,正如问题中所述,它很慢。这在Sparse Eigenvalue Problems with ARPACK 的 SciPy 教程部分中得到了证实,其中指出:

    请注意,ARPACK 通常更擅长寻找极值特征值:即具有大数量级的特征值。特别是,使用which = 'SM' 可能会导致执行时间变慢和/或异常结果。更好的方法是使用 shift-invert 模式

    实验

    让我们看看一些代码,它尝试在 SciPy 的 v0.9 和 v0.10 中使用 shift-invert。在这两种情况下,我们都将使用以下代码。

    from scipy.sparse import identity
    from scipy.sparse.linalg import eigs
    
    A = identity(10, format='csc')
    A.setdiag(range(1, 11))
    eigs(A, 3, sigma=0) # find three eigenvalues near zero using shift-invert mode
    

    SciPy v0.9

    在 SciPy v0.9 中运行代码会引发异常。

    NotImplementedError: shifted eigenproblem not supported yet
    

    SciPy v0.10

    在 SciPy 0.10 中运行代码会产生预期的结果。

    (array([ 1.+0.j,  2.+0.j,  3.+0.j]),
     array([[ -1.00000000e+00+0.j,   5.96300068e-17+0.j,   9.95488924e-17+0.j],
           [  3.55591776e-17+0.j,   1.00000000e+00+0.j,  -4.88997616e-16+0.j],
           [ -3.79110898e-17+0.j,   1.16635626e-16+0.j,   1.00000000e+00+0.j],
           [ -1.08397454e-17+0.j,   1.23544164e-17+0.j,   1.78854096e-15+0.j],
           [  1.68486368e-17+0.j,  -9.37965967e-18+0.j,   2.05571432e-16+0.j],
           [ -2.97859557e-19+0.j,  -3.43100887e-18+0.j,   3.35947574e-17+0.j],
           [  1.89565432e-17+0.j,  -3.61479402e-17+0.j,  -1.33021453e-17+0.j],
           [ -1.40925577e-18+0.j,   3.16953070e-18+0.j,   7.91193025e-17+0.j],
           [  6.76947854e-19+0.j,  -3.75674631e-19+0.j,   3.61821551e-17+0.j],
           [ -3.07505146e-17+0.j,  -6.52050102e-17+0.j,  -8.57423599e-16+0.j]]))
    

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 2015-11-18
      • 2012-12-17
      • 2022-01-25
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      相关资源
      最近更新 更多