python - Pandas - 从马尔可夫链 df 计算序列概率

标签 python pandas markov-chains

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

我的 pandas 数据框,左侧的 A-E 作为索引,顶部的 A-E 作为列,称为马尔可夫,如下所示:

    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 的建筑功能来执行此类计算?

最佳答案

您可以定义这样的函数:

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

关于python - Pandas - 从马尔可夫链 df 计算序列概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56632939/

相关文章:

python - 如何获取所有IP地址

python - 在 Python 2.7 中合并具有字典列表的字典

python - 如果列与特定值匹配,如何在 Pandas Dataframe 中创建虚拟变量?

python - 脚本继续显示“SettingCopyWithWarning”

python - 通过一次读取多行创建马尔可夫链

r - 使用 R 来估计具有底层马尔可夫过程的有限混合模型

python - 时间序列 Pandas 的线性回归

python - 当只打开一个连接时,为什么 redis pub 和 sub 被认为是不同的客户端?

python - 计算 Pandas DataFrame 中每个组的状态变化

python - 在 pymc3 中重写用于动态系统参数估计的 pymc 脚本