马尔可夫链转移矩阵上的随机游走

问题描述

我有一个累积转移矩阵,需要构建一个简单的随机游走算法来尽可能高效地从矩阵中生成 500 个值(实际矩阵为 1000 x 1000)

cum_sum

[array([0.3,0.5,0.7,0.9,1. ]),array([0.5,0.75,1.  ]),array([0.66666667,1.,1.        ]),array([0.4,0.6,0.8,1. ])]
  1. 随机选择矩阵中的初始状态i

  2. 产生一个介于 0 和 1 之间的随机

  3. 随机数的值与累积矩阵第i行的元素进行比较。如果随机数值大于前一状态的累积概率,但小于或等于后一状态的累积概率,则采用后一状态。

我尝试过的东西

def random_walk(cum_sum):
start_point=random.choice([item[0] for item in cum_sum])
random=np.random.uniform(0,1,1)
if random > start_point:
    

解决方法

您可以在每个阶段使用 numpy random choice 来模拟过渡。

您可以将概率作为参数 p,第一个位置参数定义样本空间。为了将累积概率分布转换为概率分布,我所做的是在开头插入一个零并使用 numpy diff 计算每一步的增加。

准备您的示例概率

P = np.array([
    [0.3,0.5,0.7,0.9,1. ],[0.5,0.75,1.  ],[0.66666667,1.,1.        ],[0.4,0.6,0.8,1. ]])
P = np.diff(np.hstack([np.zeros((len(P),1)),P]),axis=1)

然后运行几步

i = 0;
path = [0]
I = np.arange(len(P))
for _ in range(10):
    i = np.random.choice(I,p = P[i])
    path.append(i);
print(path)