【问题标题】:Random walk on Markov Chain Transition matrix马尔可夫链转移矩阵上的随机游走
【发布时间】:2021-06-21 09:02:13
【问题描述】:

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

cum_sum

[array([0.3, 0.5, 0.7, 0.9, 1. ]),
array([0.5 , 0.5 , 0.5 , 0.75, 1.  ]),
array([0.66666667, 1.        , 1.        , 1.        , 1.        ]),
array([0.4, 0.6, 0.8, 1. , 1. ]),
array([0.5, 0.5, 0.5, 1. , 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:
    

【问题讨论】:

  • 发生了什么?看来你“不接受”这个答案?有什么特别的原因吗?

标签: python markov-chains


【解决方案1】:

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

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

准备您的示例概率

P = np.array([
    [0.3, 0.5, 0.7, 0.9, 1. ],
    [0.5 , 0.5 , 0.5 , 0.75, 1.  ],
    [0.66666667, 1.        , 1.        , 1.        , 1.        ],
    [0.4, 0.6, 0.8, 1. , 1. ],
    [0.5, 0.5, 0.5, 1. , 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多