四亚稳态马尔可夫状态模型转移矩阵代码正确性求证
亚稳态马尔可夫模型(MSM)转移矩阵计算错误修正
你的代码逻辑存在错误,导致输出的转移矩阵元素超出[0,1]的概率取值范围,问题根源在于对亚稳态转移概率的定义理解偏差:
- 亚稳态间的转移概率,本质是从亚稳态i中的任意状态出发,一步转移到亚稳态j的加权平均概率,权重是亚稳态i内各状态的稳态概率占i总稳态概率的比例。
- 你当前用
P_i_to_j = pi_i * T_i_to_j.sum()的计算方式,是将亚稳态i的总稳态概率与i到j的所有转移概率元素之和相乘,完全不符合转移概率的定义,必然会出现大于1的结果。
修正后的代码
import numpy as np nstates = 4 transition_matrix_meta = np.zeros((nstates, nstates)) for i in range(nstates): # 获取亚稳态i包含的所有状态索引 states_i = msm.metastable_sets[i] # 计算亚稳态i的总稳态概率 pi_i = msm.pi[states_i].sum() # 生成i内各状态的权重(稳态概率占i总概率的比例) weights = msm.pi[states_i] / pi_i for j in range(nstates): # 提取原转移矩阵中i到j的子矩阵 T_i_to_j = msm.transition_matrix[states_i][:, msm.metastable_sets[j]] # 计算i内每个状态到j的转移概率之和(每行的和) prob_per_state = T_i_to_j.sum(axis=1) # 加权平均得到亚稳态i到j的转移概率 P_i_to_j = np.dot(weights, prob_per_state) transition_matrix_meta[i, j] = P_i_to_j print(transition_matrix_meta)
验证标准
修正后的矩阵每行元素之和应当等于1,符合概率矩阵的基本要求。如果原MSM的转移矩阵是合法的概率矩阵(每行和为1),那么修正后的亚稳态转移矩阵也会满足每行和为1的条件。
内容的提问来源于stack exchange,提问作者Giovanni Wences
相关产品推荐
相关产品推荐

