【发布时间】:2019-09-22 11:35:22
【问题描述】:
我正在尝试创建一个函数,该函数可以将给定的输入序列转换为请求顺序的转换矩阵。我找到了一阶马尔可夫转移矩阵的实现。
现在,我希望能够提出一个可以计算二阶和三阶转换矩阵的解决方案。
一阶矩阵实现示例:
import numpy as np
# sequence with 3 states -> 0, 1, 2
a = [0, 1, 0, 0, 0, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 1, 2, 2, 2, 0, 0, 2]
def transition_matrix_first_order(seq):
M = np.full((3, 3), fill_value = 1/3, dtype= np.float64)
for (i,j) in zip(seq, seq[1:]):
M[i, j] += 1
M = M / M.sum(axis = 1, keepdims = True)
return M
print(transition_matrix_first_order(a))
这给了我这个:
[[0.61111111 0.19444444 0.19444444]
[0.38888889 0.38888889 0.22222222]
[0.22222222 0.22222222 0.55555556]]
当制作一个二阶矩阵时,它应该有unique_state_count ** order 行和unique_state_count 列。在上面的示例中,我有 3 个唯一状态,因此矩阵将具有 9x3 结构。
理想的功能样本:
cal_tr_matrix(seq, unique_state_count, order)
【问题讨论】:
-
好吧,当您增加矩阵时,您应该简单地考虑最后一个先前的索引。我还会从
for循环中删除M = M/M.sum(..),因为这看起来不正确。 -
对不起,我会编辑它。从笔记本复制粘贴时我犯了一个错误:)
标签: python numpy probability markov-chains