python - Numpy:将可对角化方阵提高到无限次幂
问题描述
考虑具有可对角化转移矩阵 A 的马尔可夫过程,使得 A=PDP^-1,其中 D 是具有 A 的特征值的对角矩阵,P 是其列是 A 的特征向量的矩阵。
为了计算每个状态最终进入每个吸收状态的可能性,我想将转换矩阵提高到 n 次方,n 接近无穷大:
A^n=PD^nP^-1
在 Numpy 中这样做的 pythonic 方式是什么?我可以天真地计算 A 的特征值和特征向量,将特征值提高到无穷大。由于我假设我有一个转移矩阵,我们将只有等于 1 的特征值(将保持为 1),以及 0 和 1 之间的特征值将变为 0(受此答案的启发):
import numpy as np
from scipy import linalg
# compute left eigenvalues and left eigenvectors
eigenvalues, leftEigenvectors = linalg.eig(transitionMatrix, right=False, left=True)
# for stationary distribution, eigenvalues and vectors are real (up to numerical precision)
eigenvalues = eigenvalues.real
leftEigenvectors = leftEigenvectors.real
# create a filter to collect the eigenvalues close to one
absoluteTolerance = 1e-10
mask = abs(eigenvalues - 1) < absoluteTolerance
# raise eigenvalues to the power of infinity
eigenvalues[mask] = 1
eigenvalues[~mask] = 0
D_raised = np.diag(eigenvalues)
A_raised = leftEigenvectors @ D_raised @ linalg.inv(leftEigenvectors)
这会是推荐的方法吗,即一种在数值上既稳定又有效的方法?
解决方案
推荐阅读
- excel - 为什么 FormulaR1C1 确实发生了运行时错误“1004”
- android - 我应该在 Flutter 应用程序导出中命名我的 KeyAlias 什么?
- sql - 同一模块中的两个异常
- python - 在不使用模块的情况下将 CSV 文件导入列表列表
- java - 无法在 HDFS 中找到带有 JAR 的文本文件
- kubernetes - 是否可以跟踪 kubernetes pod 日志并对其进行 grep 处理?
- python - 面对 Tkinter 中的列跨度问题
- php - 带有实体的自定义 Symfony 捆绑包
- python - 尝试定义函数时出现错误消息
- python - 从字典到数据框结构