使用 scipy 的矩阵求幂:expm、expm2 和 expm3
Matrix exponentiation with scipy: expm, expm2 and expm3
可以使用 scipy.linalg
库中的函数在 python 中执行矩阵求幂,即 expm, expm2, expm3
。 expm
使用 Pade 近似; expm2
使用特征值分解方法,expm3
使用默认项数为 20 的泰勒级数。
在 SciPy 0.13.0 发行说明中指出:
The matrix exponential functions scipy.linalg.expm2 and scipy.linalg.expm3 are deprecated. All users should use the numerically more robust scipy.linalg.expm function instead.
虽然 expm2
和 expm3
自发布版本 SciPy 0.13.0 以来已被弃用,但我发现在许多情况下这些实现比 expm
更快。
由此产生一些问题:
在什么情况下expm2 和expm3 会导致数值不稳定?
在什么情况下(例如稀疏矩阵、对称等)每个算法 faster/more 都是精确的?
这在很大程度上取决于对矩阵求幂的这些不同方法的实施细节。
一般来说,我认为 eigen-decomposition (expm2
) 不太适合稀疏矩阵,因为它可能会消除稀疏性。它也将更难应用于 non-symmetric 矩阵,因为这将需要使用复杂的算术和更昂贵的算法来计算 eigen-decomposition.
对于 Taylor-series 方法 (expm3
),如果有固定数量的项独立于矩阵的范数,这听起来很冒险。当计算标量 x 的 e^x 时,泰勒级数中的最大项围绕 n 接近 x 的项。
但是,这些(已弃用的)函数的实现细节可能会使用对角线加载矩阵等技巧,以提高这些级数展开的稳定性。
可以使用 scipy.linalg
库中的函数在 python 中执行矩阵求幂,即 expm, expm2, expm3
。 expm
使用 Pade 近似; expm2
使用特征值分解方法,expm3
使用默认项数为 20 的泰勒级数。
在 SciPy 0.13.0 发行说明中指出:
The matrix exponential functions scipy.linalg.expm2 and scipy.linalg.expm3 are deprecated. All users should use the numerically more robust scipy.linalg.expm function instead.
虽然 expm2
和 expm3
自发布版本 SciPy 0.13.0 以来已被弃用,但我发现在许多情况下这些实现比 expm
更快。
由此产生一些问题:
在什么情况下expm2 和expm3 会导致数值不稳定?
在什么情况下(例如稀疏矩阵、对称等)每个算法 faster/more 都是精确的?
这在很大程度上取决于对矩阵求幂的这些不同方法的实施细节。
一般来说,我认为 eigen-decomposition (expm2
) 不太适合稀疏矩阵,因为它可能会消除稀疏性。它也将更难应用于 non-symmetric 矩阵,因为这将需要使用复杂的算术和更昂贵的算法来计算 eigen-decomposition.
对于 Taylor-series 方法 (expm3
),如果有固定数量的项独立于矩阵的范数,这听起来很冒险。当计算标量 x 的 e^x 时,泰勒级数中的最大项围绕 n 接近 x 的项。
但是,这些(已弃用的)函数的实现细节可能会使用对角线加载矩阵等技巧,以提高这些级数展开的稳定性。