【问题标题】:Pandas - Calculate probability of sequence from Markov chain dfPandas - 从马尔可夫链 df 计算序列的概率
【发布时间】:2019-06-17 14:03:00
【问题描述】:

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

我的 pandas 数据框,左侧为 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

假设我要检查称为序列的序列的概率:['A', 'C', 'D']。这意味着从 A 到 C,从 C 到 D 的转换。结果应该是 0.05。

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

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

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

我怎样才能做到这一点?我是否忽略了 pandas 的构建功能来执行此类计算?

【问题讨论】:

    标签: python pandas markov-chains


    【解决方案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
    

    【讨论】:

    • 效果很好!你能解释一下 *args 的用法吗,因为我总是在解释它时遇到问题。
    • 基本上,我认为*args 是您传递给函数的所有未命名变量的(引用)列表(与get_prob3(df=markov, walks='ABCD') 等命名变量相反。您可以找到详细信息here.
    猜你喜欢
    • 2014-10-06
    • 2023-03-31
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2022-01-24
    • 2018-03-25
    相关资源
    最近更新 更多