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

Python中稀疏矩阵N个最小特征值的计算,python,scipy,sparse-matrix,eigenvalue,Python,Scipy,Sparse Matrix,Eigenvalue,我想在Python中找到稀疏矩阵的N个最小特征值。我尝试过使用scipy.sparse.linalg.eigen.arpack包,但是它在计算最小特征值时非常慢。我在某个地方读到有换档反转模式,但当我尝试使用它时,我收到一条错误消息,告诉我换档反转模式还不受支持。关于我应该如何进行,有什么想法吗?SciPy版本 将的文件与的文件进行比较,似乎换档反转模式自v0.10开始实施和工作。具体而言,v0.9文件中对sigma参数的解释表明,该参数未实施,但v0.10文件并未表明情况如此 如果您没有Sci

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

SciPy版本 将的文件与的文件进行比较,似乎换档反转模式自v0.10开始实施和工作。具体而言,v0.9文件中对
sigma
参数的解释表明,该参数未实施,但v0.10文件并未表明情况如此

如果您没有SciPy v0.10或更高版本,安装最新版本应使您能够利用稀疏特征解算器的移位反转模式

缓慢寻找小幅度特征值 如问题中所述,可以使用ARPACK接口查找小幅度特征值。这是通过调用
scipy.sparse.linalg.eigs
时传递
which='SM'
来完成的。然而,正如问题中所述,这是缓慢的。这一点在SciPy教程关于的部分中得到了确认,其中指出:

请注意,ARPACK通常更擅长于寻找极值特征值:即具有较大震级的特征值。特别是,使用
which='SM'
可能导致执行时间缓慢和/或异常结果。更好的方法是使用移位反转模式

实验 让我们看看一些试图将shift invert与SciPy的v0.9和v0.10一起使用的代码。在这两种情况下,我们将使用以下代码

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]]))