在Python中计算稀疏矩阵的N个最小特征值

Eli*_*zer 6 python scipy eigenvalue sparse-matrix

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

Dav*_*ber 6

SciPy版本

scipy.sparse.linalg.eigsSciPy v0.9的文档scipy.sparse.linalg.eigs与SciPy v0.10的文档进行比较,看来自从v0.10开始实现了shift-invert模式.具体来说,sigmav0.9文档中的参数说明未声明,但v0.10文档并未指出是这种情况.

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

慢寻找小幅度特征值

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

注意,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
Run Code Online (Sandbox Code Playgroud)

SciPy v0.9

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

NotImplementedError: shifted eigenproblem not supported yet
Run Code Online (Sandbox Code Playgroud)

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]]))
Run Code Online (Sandbox Code Playgroud)