【问题标题】:pyro: how to specify conditional distributionpyro:如何指定条件分布
【发布时间】:2021-10-06 20:25:42
【问题描述】:

我正在尝试使用 pyro 来指定贝叶斯网络。我有一个子节点D,它是连续的,它有三个离散节点是父节点,每个节点都有 10 种可能的状态:

所以,我首先将我的离散节点定义为:

import torch
import pyro
import pyro.distributions as dist

def model(data):
    A = pyro.sample("A", dist.Dirichlet(torch.ones(10)))
    B = pyro.sample("B", dist.Dirichlet(torch.ones(10)))
    C = pyro.sample("C", dist.Dirichlet(torch.ones(10)))
    

现在,据我了解,我需要定义 P(D|A, B, C)。我想将其建模为正态分布,但不确定如何进行此调节。我的计划是对这个分布参数进行先验,然后使用 MCMC 或 HMC 来估计后验分布并学习模型参数。

但是,不确定如何继续进行模型定义。

【问题讨论】:

    标签: pytorch pyro.ai


    【解决方案1】:

    pyro 的好处是模型定义非常 Pythonic。底层 PyTorch 机制可以为您跟踪依赖关系。

    您只需要使用样本ABC 并计算条件p(D|A,B,C) 的参数

    def cond_mean(a, b, c):
        return # use a,b,c to compute mean
    
    def cond_scale(a, b, c):
        return # use a,b,c to compute scale
    
    def model(data):
        A = pyro.sample("A", dist.Dirichlet(torch.ones(10)))
        B = pyro.sample("B", dist.Dirichlet(torch.ones(10)))
        C = pyro.sample("C", dist.Dirichlet(torch.ones(10)))
    
        D = pyro.sample("D", dist.Normal(loc=cond_mean(A, B, C), scale=cond_scale(A, B, C)
        ...
    

    【讨论】:

    • 哇,这真是太棒了。我可以问一个后续问题...这更多的是关于一般建模...人们通常如何对这样的条件分布进行建模?我的意思是这些看起来像什么......例如,在这种情况下,考虑到我的父节点是离散的,是否应该从训练数据中得到一些估计。所以,我会有这样的组合:``` if a== 0 and b == 1 and c== 2: return something elif ... return something ```如果父母之一是连续节点?
    • 这是一个广泛的问题,需要了解您的整个模型、数据和最终目标。随时在 ai.stackexchange.com 上发布您的详细问题
    • 我在这里添加了问题:ai.stackexchange.com/questions/31953/… 不幸的是,没有标签用于 pyro
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2012-01-01
    相关资源
    最近更新 更多