熊猫-从马尔可夫链df

时间:2019-06-17 14:03:00

标签: python pandas markov-chains

我想计算马尔可夫链中多个序列的概率。我已经准备好了马尔可夫链,但是我不确定如何轻松地计算特定的序列概率。

我的熊猫数据框,其左侧为A-E作为索引,顶部为A-E作为列,称为Markov,如下所示:

    A   B   C   D   E
A   0.3 0.2 0.5 0.0 0.2
B   0.2 0.4 0   0   0.4
C   0.5 0.4 0   0.1 0
D   0.2 0.2 0.2 0.2 0.2 
E   0.6 0.1 0.1 0.1 0.1

让我们假设我要检查称为sequence的序列的概率:['A','C','D']。这表示从A到C,从C到D的过渡。结果应为0.05。

我通过使用pandas .at函数成功了:

markov.at[sequence[0], sequence[1]] * markov.at[sequence[1], sequence[2]].

但是,我想构建一个函数,当我将每行长度不同的序列表交给它时,它会计算相应的序列概率。在我的方法中,每次我要检查特定序列时,都必须手动更改代码。

我该如何实现?我是否可以忽略熊猫的建筑特征来进行此类计算?

1 个答案:

答案 0 :(得分:1)

您可以定义如下函数:

def get_prob(*args):
    ret = 1
    for i, j in zip(args, args[1:]):
        ret *= markov.at[i,j]

    return ret

然后致电:

get_prob('A','C','D')
# 0.05

get_prob('A', 'C', 'D', 'E')
# 0.010000000000000002

或者您可以这样做:

def get_prob2(lst):
    ret = 1
    for i,j in zip(lst, lst[1:]):
        ret *= markov.at[i,j]

    return ret

因此您可以传递字符串(或列表):

get_prob2('ACDE')
# 0.010000000000000002