我想在 Python 中找到稀疏矩阵的 N 个最小特征值。我试过使用这个scipy.sparse.linalg.eigen.arpack
包,但计算最小的特征值非常慢。我在某处读到有移位反转模式,但是当我尝试使用它时,我收到一条错误消息,告诉我还不支持移位反转模式。关于我应该如何进行的任何想法?
1 回答
SciPy 版本
将scipy.sparse.linalg.eigs
SciPy v0.9的文档scipy.sparse.linalg.eigs
与 SciPy v0.10的文档进行比较,似乎从 v0.10 开始实现并运行移位反转模式。具体来说,sigma
v0.9 文档中对参数的解释说明它没有实现,但 v0.10 文档没有说明是这种情况。
如果您没有 SciPy v0.10 或更高版本,安装最新版本应该可以让您使用带有稀疏特征解算器的 shift-invert 模式。
缓慢寻找小幅度特征值
如问题中所述,可以使用 ARPACK 接口查找小幅度特征值。这是通过which='SM'
在调用时传递来完成的scipy.sparse.linalg.eigs
。但是,正如问题中所述,它很慢。这在 SciPy Tutorial's section on Sparse Eigenvalue Problems with ARPACK中得到证实,其中指出:
请注意,ARPACK 通常更擅长寻找极值特征值:即具有较大幅度的特征值。特别是,使用
which = 'SM'
可能会导致缓慢的执行时间和/或异常结果。更好的方法是使用shift-invert mode。
实验
让我们看一些代码,尝试在 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]]))