我正在学习本教程: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
为条件的权重分布中获得样本吗?如果是这样,权重的样本是否应该不同,因为在第一次调用中我们没有观察到任何数据,但在第二次调用中,我们以数据为条件?
谢谢!
运行模型不会从后部产生样本;您需要运行推理(如SVI
或MCMC
(。
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