首页 > 解决方案 > 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)

这会是推荐的方法吗,即一种在数值上既稳定又有效的方法?

标签: pythonnumpymatrixeigenvaluemarkov-models

解决方案


推荐阅读