【发布时间】:2021-03-04 15:43:21
【问题描述】:
我正在使用 pyMC3 模拟一个非常基本的贝叶斯网络。在这个模拟中,我只有分类变量。给定一个变量的值,我想根据我用来存储条件概率的 Pandas Dataframe 的输出设置另一个变量的分布。例如,如果x是一个pyMC3随机变量,而x=1在模拟实例中,那么我想访问p_y_cond_x.loc[x],在这个实例中只是p_y_cond_x.loc[1],这里p_y_cond_x是存储为熊猫系列的预先计算(使用数据)条件概率表。
有什么简单的方法可以做到这一点吗?不幸的是,x 在实例化模型时不是整数(例如,使用with 块),所以我不确定如何在模拟运行时访问它的值并执行上述操作。
我已经看到使用pm.math.switch 的解决方案,但不幸的是我的变量是三元的,所以我需要为每个条件使用两个开关。此外,如果我需要以多个变量为条件,我想这会很痛苦。
【问题讨论】:
-
也许可以尝试将
theano.tensor.extra_ops.to_one_hot应用于x,这会将其扩展为一个矩阵,然后您可以将该矩阵与p_y_cond_x向量相乘以产生您想要获得的相应向量。可能有更有效的方法 - 取决于 one-hot 编码矩阵是否稀疏 (IDK)。
标签: python bayesian montecarlo pymc3 pymc