scipy.sparse.linalg.

eigsh#

scipy.sparse.linalg.eigsh(A, k=6, M=None, sigma=None, which='LM', v0=None, ncv=None, maxiter=None, tol=0, return_eigenvectors=True, Minv=None, OPinv=None, mode='normal')[source]#

查找实对称方阵或复厄米特矩阵 A 的 k 个特征值和特征向量。

求解 A @ x[i] = w[i] * x[i],即标准特征值问题,其中 w[i] 为特征值,x[i] 为对应的特征向量。

如果指定了 M,则求解 A @ x[i] = w[i] * M @ x[i],即广义特征值问题,其中 w[i] 为特征值,x[i] 为对应的特征向量。

请注意,当 A 为复厄米特矩阵时,没有专门的例程。在这种情况下,eigsh() 将调用 eigs() 并返回由此获得的特征值的实部。

参数:
Andarray、稀疏矩阵或线性算子

一个平方算子,表示操作 A @ x,其中 A 为实对称或复厄米特矩阵。对于屈曲模式(见下文),A 必须另外为正定矩阵。

kint,可选

所需的特征值和特征向量的数量。k 必须小于 N。无法计算矩阵的所有特征向量。

返回值:
warray

k 个特征值的数组。

varray

表示 k 个特征向量的数组。列 v[:, i] 是与特征值 w[i] 相对应的特征向量。

其他参数:
M一个 N x N 矩阵、数组、稀疏矩阵或线性算子,表示

操作 M @ x 用于广义特征值问题

A @ x = w * M @ x。

如果 A 为实数,则 M 必须表示实对称矩阵,如果 A 为复数,则 M 必须表示复厄米特矩阵。为了获得最佳结果,M 的数据类型应与 A 的数据类型相同。另外

如果 sigma 为 None,则 M 为对称正定矩阵。

如果指定了 sigma,则 M 为对称半正定矩阵。

在屈曲模式下,M 为对称不定矩阵。

如果 sigma 为 None,则 eigsh 需要一个算子来计算线性方程 M @ x = b 的解。这在内部通过对显式矩阵 M 进行(稀疏)LU 分解,或通过对一般线性算子进行迭代求解来实现。或者,用户可以提供矩阵或算子 Minv,它给出 x = Minv @ b = M^-1 @ b

sigmareal

使用移位反转模式查找 sigma 附近的特征值。这需要一个算子来计算线性系统 [A - sigma * M] x = b 的解,其中 M 如果未指定则为单位矩阵。这在内部通过对显式矩阵 A & M 进行(稀疏)LU 分解,或通过迭代求解(如果 A 或 M 为一般线性算子)来实现。或者,用户可以提供矩阵或算子 OPinv,它给出 x = OPinv @ b = [A - sigma * M]^-1 @ b。请注意,当指定 sigma 时,关键字 'which' 指的是移位特征值 w'[i],其中

如果 mode == 'normal',则 w'[i] = 1 / (w[i] - sigma)

如果 mode == 'cayley',则 w'[i] = (w[i] + sigma) / (w[i] - sigma)

如果 mode == 'buckling',则 w'[i] = w[i] / (w[i] - sigma)

(见下文 'mode' 中的进一步讨论)

v0ndarray,可选

迭代的起始向量。默认:随机

ncvint,可选

生成的 Lanczos 向量的数量 ncv 必须大于 k 且小于 n;建议 ncv > 2*k。默认:min(n, max(2*k + 1, 20))

whichstr [‘LM’ | ‘SM’ | ‘LA’ | ‘SA’ | ‘BE’]

如果 A 为复厄米特矩阵,则 'BE' 无效。要查找哪些 k 个特征向量和特征值

‘LM’:最大(按幅度)特征值。

‘SM’:最小(按幅度)特征值。

‘LA’:最大(代数)特征值。

‘SA’:最小(代数)特征值。

‘BE’:从频谱的两端各取一半 (k/2)。

当 k 为奇数时,从高端返回一个 (k/2+1)。当 sigma != None 时,'which' 指的是移位特征值 w'[i](见上文 'sigma' 中的讨论)。ARPACK 通常更善于查找大值而不是小值。如果需要小特征值,请考虑使用移位反转模式以获得更好的性能。

maxiterint,可选

允许的最大 Arnoldi 更新迭代次数。默认:n*10

tolfloat

特征值的相对精度(停止标准)。默认值为 0 表示机器精度。

MinvN x N 矩阵、数组、稀疏矩阵或线性算子

见上文 M 中的说明。

OPinvN x N 矩阵、数组、稀疏矩阵或线性算子

见上文 sigma 中的说明。

return_eigenvectorsbool

除了特征值外,还返回特征向量 (True)。此值决定特征值排序的顺序。排序顺序还取决于 which 变量。

对于 which = 'LM' 或 'SA'

如果 return_eigenvectors 为 True,则按代数值对特征值进行排序。

如果 return_eigenvectors 为 False,则按绝对值对特征值进行排序。

对于 which = 'BE' 或 'LA'

特征值始终按代数值排序。

对于 which = 'SM'

如果 return_eigenvectors 为 True,则按代数值对特征值进行排序。

如果 return_eigenvectors 为 False,则按绝对值降序对特征值进行排序。

modestring [‘normal’ | ‘buckling’ | ‘cayley’]

指定用于移位反转模式的策略。此参数仅适用于实数 A 和 sigma != None。对于移位反转模式,ARPACK 在内部求解特征值问题 OP @ x'[i] = w'[i] * B @ x'[i],并将得到的 Ritz 向量 x'[i] 和 Ritz 值 w'[i] 转换为问题 A @ x[i] = w[i] * M @ x[i] 的所需特征向量和特征值。模式如下

‘normal’

OP = [A - sigma * M]^-1 @ M, B = M, w’[i] = 1 / (w[i] - sigma)

‘buckling’

OP = [A - sigma * M]^-1 @ A, B = A, w’[i] = w[i] / (w[i] - sigma)

‘cayley’

OP = [A - sigma * M]^-1 @ [A + sigma * M], B = M, w’[i] = (w[i] + sigma) / (w[i] - sigma)

模式的选择会影响关键字“which”选择的特征值,也会影响收敛的稳定性(有关讨论,请参见[2])。

引发:
ArpackNoConvergence

当未获得所需的收敛性时。

当前收敛的特征值和特征向量可以在异常对象的 eigenvalueseigenvectors 属性中找到。

另请参阅

eigs

一般(非对称)矩阵 A 的特征值和特征向量

svds

矩阵 A 的奇异值分解

笔记

此函数是 ARPACK [1] SSEUPD 和 DSEUPD 函数的包装器,它们使用隐式重启 Lanczos 方法来查找特征值和特征向量 [2]

参考文献

[1]

ARPACK 软件,opencollab/arpack-ng

[2]

R. B. Lehoucq、D. C. Sorensen 和 C. Yang,ARPACK 用户指南:通过隐式重启 Arnoldi 方法求解大规模特征值问题。SIAM,费城,PA,1998 年。

示例

>>> import numpy as np
>>> from scipy.sparse.linalg import eigsh
>>> identity = np.eye(13)
>>> eigenvalues, eigenvectors = eigsh(identity, k=6)
>>> eigenvalues
array([1., 1., 1., 1., 1., 1.])
>>> eigenvectors.shape
(13, 6)