假设我有一系列4种可能的马尔可夫状态(a、B、C、D):

X = [A, B, B, C, B, A, D, D, A, B, A, D, ....]

如何使用Python生成马尔可夫变换矩阵?矩阵必须是4乘4,显示从每个状态移动到其他3个状态的概率.

下面是一个R代码,它正是我在Python中try 做的事情:

推荐答案

这可能会给你一些 idea :

transitions = ['A', 'B', 'B', 'C', 'B', 'A', 'D', 'D', 'A', 'B', 'A', 'D']

def rank(c):
    return ord(c) - ord('A')

T = [rank(c) for c in transitions]

#create matrix of zeros

M = [[0]*4 for _ in range(4)]

for (i,j) in zip(T,T[1:]):
    M[i][j] += 1

#now convert to probabilities:
for row in M:
    n = sum(row)
    if n > 0:
        row[:] = [f/sum(row) for f in row]

#print M:

for row in M:
    print(row)

输出:

[0.0, 0.5, 0.0, 0.5]
[0.5, 0.25, 0.25, 0.0]
[0.0, 1.0, 0.0, 0.0]
[0.5, 0.0, 0.0, 0.5]

On Edit以下是一个实现上述思想的函数:

#the following code takes a list such as
#[1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1]
#with states labeled as successive integers starting with 0
#and returns a transition matrix, M,
#where M[i][j] is the probability of transitioning from i to j

def transition_matrix(transitions):
    n = 1+ max(transitions) #number of states

    M = [[0]*n for _ in range(n)]

    for (i,j) in zip(transitions,transitions[1:]):
        M[i][j] += 1

    #now convert to probabilities:
    for row in M:
        s = sum(row)
        if s > 0:
            row[:] = [f/s for f in row]
    return M

#test:

t = [1,1,2,6,8,5,5,7,8,8,1,1,4,5,5,0,0,0,1,1,4,4,5,1,3,3,4,5,4,1,1]
m = transition_matrix(t)
for row in m: print(' '.join('{0:.2f}'.format(x) for x in row))

输出:

0.67 0.33 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.50 0.12 0.12 0.25 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00
0.00 0.00 0.00 0.50 0.50 0.00 0.00 0.00 0.00
0.00 0.20 0.00 0.00 0.20 0.60 0.00 0.00 0.00
0.17 0.17 0.00 0.00 0.17 0.33 0.00 0.17 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
0.00 0.33 0.00 0.00 0.00 0.33 0.00 0.00 0.33

Python-3.x相关问答推荐

是否可以使用参数对Flask重定向?

如何绘制交叉验证的AUROC并找到最佳阈值?

在Pandas 数据帧中为小于5位的邮政编码添加前导零

在BaseHTTPRequestHandler中填充和返回列表

如何将参数/值从测试方法传递给pytest的fixture函数?

Python webdrivermanager 和 Chrome 115.0 的 URL https://chromedriver.storage.googleapis.com/LATEST_RELEASE_115.0.5790 错误没有此类驱动程序

Python中根据分组/ID对两个数据框进行映射,以更接近值的升序排列

基于Pandas列动态创建分箱,以使观测值数量或计数占总计数的1%.

我应该如何调整我的变量,以便如果有任何单词符合其中的条件,程序会将其附加到新列表中?

Python 3 - 给定未知数量的类别动态地将字典嵌套到列表中

如何使用 django rest 框架在 self forienkey 中删除多达 n 种类型的数据?

多进程:两个进程,一起杀死

过滤查询集和Q运算符的不同值

为什么我不能通过索引获取字典键?

在python中循环处理时并行写入文件

Python:获取未绑定的类方法

为什么中断比引发异常更快?

在 macbook pro M1 上安装 Tensorflow 时出现zsh:非法硬件指令 python

Python,Docker - ascii编解码器无法编码字符

交错4个相同长度的python列表