Pyro和条件概率



我正在学习本教程:Pyro 中的推理简介

我不明白的是以下内容。为了得到(𝗐𝖾𝗂𝗀𝗁𝗍|𝗀𝗎𝖾𝗌𝗌,𝗆𝖾𝖺𝗌𝗎𝗋𝖾𝗆𝖾𝗇𝗍=9.5),我们可以将pyro.condition函数与一起使用

def scale(guess):
weight = pyro.sample("weight", dist.Normal(guess, 1.0))
print(weight)
return pyro.sample("measurement", dist.Normal(weight, 0.75))

conditioned_scale = pyro.condition(scale, data={"measurement": 9.5})

我写了以下脚本:

pyro.set_rng_seed(101)
scale(0.3) # tensor(-1.0905)
pyro.set_rng_seed(101)
conditioned_scale(0.3) # tensor(-1.0905)

对于这两个函数,我们得到相同的权重样本。本教程不是说使用conditioned_scale,我们从以measurement=9.5为条件的权重分布中获得样本吗?如果是这样,权重的样本是否应该不同,因为在第一次调用中我们没有观察到任何数据,但在第二次调用中,我们以数据为条件?

谢谢!

运行模型不会从后部产生样本;您需要运行推理(如SVIMCMC(。

condition将使用您指定的值替换示例场地值。由于为measurement指定了值,因此weight不受影响。您编写的模型相当于N(measurement;N(weight;guess,1),.75),通过条件反射,您已经声明了measurement=9.5。CCD_ 13和相同的密钥将产生不同的测量。下面我用NumPyro写了同样的程序。你应该结账https://forum.pyro.ai/.

import numpyro
import numpyro.distributions as dist

def scale(rng_key, guess):
w_key, m_key = random.split(rng_key)
weight = numpyro.sample("weight", dist.Normal(guess, 1.0), rng_key=w_key)
print(weight)
return numpyro.sample("measurement", dist.Normal(weight, 0.75), rng_key=m_key)

if __name__ == '__main__':
rng_key = random.PRNGKey(0)
print(scale(rng_key, 0.3))  # -0.49476373
conditioned_scale = numpyro.handlers.condition(scale, data={"weight": 9.5})
print(conditioned_scale(rng_key, 0.3))  # 8.561346

最新更新