jax.experimental.sparse.linalg.lobpcg_standard#

jax.experimental.sparse.linalg.lobpcg_standard(A, X, m=100, tol=None)[源代码]#

使用 LOBPCG 例程计算前 k 个标准特征值。

LOBPCG [1] 代表“局部最优块预处理共轭梯度法”。该方法能够以一种对加速器友好的方式找到前 k 个特征向量。

这个初步的实验版本有几个注意事项。

  • 仅支持标准特征值问题 A U = lambda U,不支持广义特征值问题。

  • 暂不支持梯度计算。

  • f64 仅在 jnp.linalg.eigh 支持该类型的情况下才有效。

  • 尚未支持查找最小特征向量。因此,我们暂不支持预处理,这在很多情况下对于查找最小特征向量是必需的。

实现基于 [2] 和 [3];然而,我们在多个方面偏离了这些来源,以提高鲁棒性或便于实现。

  • 尽管增加了迭代成本,我们始终为块搜索方向维护一个正交基。

  • 我们更改了收敛标准;请参阅 tol 参数。

  • 故意不实现软锁定 [4];它依赖于选择一个合适的问题特定容差,以防止在接近收敛时,由于近零残差的灾难性取消而导致的爆炸。相反,实现的这种方法倾向于截断迭代基。

[1]: http://ccm.ucdenver.edu/reports/rep149.pdf [2]: https://arxiv.org/abs/1704.07458 [3]: https://arxiv.org/abs/0705.2626 [4]: DOI 10.13140/RG.2.2.11794.48327

参数:
  • A (jax.Array | Callable[[jax.Array], jax.Array]) – 一个 (n, n) 的数组,代表一个方形厄米特矩阵,或者一个作用于其上的可调用对象。

  • X (jax.Array) – 一个 (n, k) 的数组,代表您想要的 k 个顶层特征向量的初始搜索方向。这不一定需要正交,但必须在数值上线性无关(X 将会被正交化)。请注意,我们必须有 0 < k * 5 < n

  • m (int) – 最大整数迭代次数;LOBPCG 将只会在 Krylov 基 {X, A X, A^2 X, …, A^m X}(的子空间)中进行搜索。

  • tol (jax.Array | float | None) – 一个浮点收敛容差;当一个特征对 (lambda, v) 的残差 L2 范数 r = |A v - lambda v| 低于 tol * 10 * n * (lambda + |A v|) 时,被认为已收敛,这大致估计了理想特征向量的浮点误差最坏情况。如果所有 k 个特征向量都满足容差比较,则 LOBPCG 将提前退出。如果留空(None),则设置为 A.dtype 的浮点 epsilon。

返回:

theta, U, i,其中 theta 是一个 (k,) 的特征值数组,U 是一个 (n, k) 的特征向量数组,i 是执行的迭代次数。

引发:

ValueError – 如果 A,X 的数据类型或 n 的维度不匹配,或者 k 过大(仅支持 k * 5 < n),或者 k == 0