满足收敛假设的马尔可夫链城市车辆出行建模不收敛问题求助
问题原因分析
- 转移矩阵不符合马尔可夫链基本约束,每行概率和不为1。经校验你提供的转移矩阵第一行求和仅为0.87,第六行求和为1.298,不满足转移矩阵每行元素和为1的要求,这是无法得到正确稳态的核心原因。
- 迭代逻辑未设置收敛判定条件,仅固定迭代10000次无法确认是否达到稳态,也可能因数值误差导致结果漂移。
修复方案
首先需要对原始转移矩阵做行归一化,确保每行的元素和为1,再优化迭代逻辑增加收敛判定,修正后的参考代码如下:
import numpy as np # 原始转移矩阵 T = np.array([[0.772,0.044,0.001,0.026,0.026,0.001], [0.114,0.760,0.183,0.026,0.022,0.007], [0.001,0.112,0.447,0.055,0.056,0.008], [0.057,0.028,0.157,0.473,0.022,0.001], [0.055,0.042,0.184,0.394,0.556,0.072], [0.001,0.014,0.026,0.028,0.318,0.911]]).reshape(6,6) # 行归一化修正转移矩阵 T = T / T.sum(axis=1, keepdims=True) # 初始状态矩阵 A1 = np.array([0.086,0.180,0.086,0.078,0.219,0.350]).reshape(6,1) forw = A1 threshold = 1e-8 # 收敛阈值 max_iter = 10000 i = 0 while i < max_iter: next_state = np.dot(T, forw) # 判定是否收敛 if np.linalg.norm(next_state - forw) < threshold: print(f"迭代{i}次后达到稳态") break forw = next_state i += 1 steady_state = forw.flatten() print("稳态分布:", steady_state) print("稳态分布和校验:", steady_state.sum())
你也可以通过特征值法直接求解稳态分布,效率更高:
eigenvalues, eigenvectors = np.linalg.eig(T.T) # 找到最接近1的特征值对应的特征向量 steady_idx = np.argmin(np.abs(eigenvalues - 1)) steady_state = eigenvectors[:, steady_idx].real # 归一化保证和为1 steady_state = steady_state / steady_state.sum() print("特征值法求解的稳态分布:", steady_state)
内容的提问来源于stack exchange,提问作者Fillip
相关产品推荐
相关产品推荐

