Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 如何协调TFP与PyMC3 MCMC结果?_Tensorflow_Pymc3_Mcmc_Tensorflow Probability - Fatal编程技术网

Tensorflow 如何协调TFP与PyMC3 MCMC结果?

Tensorflow 如何协调TFP与PyMC3 MCMC结果?,tensorflow,pymc3,mcmc,tensorflow-probability,Tensorflow,Pymc3,Mcmc,Tensorflow Probability,在尝试TFP时,我尝试从共轭正态模型(已知方差)的后验分布中取样,即 x | mu~正常(mu,1.) mu~正常(4,2.) 与pymc3和分析溶液相比,tf.mcmc.1取样器给出了不同的后验值。注意:pymc3检索正确的后半部 我还尝试了TFP中的HMC采样器,结果相同(不正确) !pip安装tensorflow==2.0.0-beta0 !pip每晚安装tfp ###进口 将numpy作为np导入 将pymc3作为pm导入 导入tensorflow作为tf 导入tensorflow_概率

在尝试TFP时,我尝试从共轭正态模型(已知方差)的后验分布中取样,即

x | mu~正常(mu,1.)

mu~正常(4,2.)

与pymc3和分析溶液相比,tf.mcmc.1取样器给出了不同的后验值。注意:pymc3检索正确的后半部

我还尝试了TFP中的HMC采样器,结果相同(不正确)

!pip安装tensorflow==2.0.0-beta0
!pip每晚安装tfp
###进口
将numpy作为np导入
将pymc3作为pm导入
导入tensorflow作为tf
导入tensorflow_概率作为tfp
tfd=tfp
将matplotlib.pyplot作为plt导入
导入seaborn作为sns
tf.random.set_种子(1905)
%matplotlib内联
sns.set(rc={'figure.figsize':(9.3,6.1)})
sns.set_上下文(“纸张”)
sns.set_样式('whitegrid'))
###创建数据
观察值=tfd。正常值(loc=0,刻度=1)。样本(20)
sns.distplot(观察到,kde=False)
轻视;
###模型
#先前的
mu_0,sigma_0=4,2。
先验=tfd正常值(μ0,σ0)
#可能性
mu,sigma=先验样本(1),1.#使用前面的样本作为mu的猜测
似然度=tfd正常值(μ,σ)
#函数解析地得到后验概率
def get_param_更新(数据、sigma、Previor_mu、Previor_sigma):#已知sigma
n=len(数据)
西格玛2=西格玛**2
先验西格玛2=先验西格玛**2
x_bar=tf.reduce_平均值(数据)
post_mu=((sigma2*prior_mu)+(n*prior_sigma2*x_bar))/((n*prior_sigma2)+(sigma2))
后sigma2=(sigma2*前sigma2)/(n*前sigma2)+sigma2)
后西格玛=tf.math.sqrt(后西格玛2)
返回post\u mu,post\u sigma
#后
mu_n,sigma_n=获取参数更新(观察到,
西格玛=1,
先验μ=μ0,
优先权(西格玛=西格玛(0)
后验=tfd.正常(μn,sigma\n,name='posterior')
###PyMC3
#定义模型
使用pm.Model()作为模型:
μ=pm.正常值('μ',μ=4.,σ=2.)
x=pm.正常('观察到',μ=μ,σ=1.,观察到=观察到)
跟踪pm=pm.sample(10000,调谐=500,链=1)
#阴谋
sns距离图(后验样本(10**5))
sns.distplot(trace_pm['mu']))
plt.图例(标签=['Analytic Posterior','PyMC Posterior'];
###全要素生产率
#用于评估样本的联合测井探头的定义
def联合日志问题(数据、提案):
prior=tfd.Normal(mu_0,sigma_0,name='prior')
可能性=tfd.正常(提案,西格玛,名称='似然')
返回值(之前的log\u prob(建议)+tf.reduce\u均值(似然性log\u prob(数据)))
#在joint_log_prob上定义闭包
def非标准化日志(建议):
返回联合日志问题(数据=观察到的,建议=建议)
#定义如何提议状态
rwm=tfp.mcmc(
目标\u log\u prob\u fn=未标准化\u log\u后
)
#定义初始状态
初始状态=tf.常量(0,name='initial_state')
#样本跟踪
跟踪,内核结果=tfp.mcmc.sample\u链(
数值结果=10**5,
步骤数=5000,
当前状态=初始状态,
结果之间的步数=1,
内核=rwm,
并行迭代=1
)
#阴谋
sns距离图(后验样本(10**5))
sns.distplot(trace_pm['mu']))
sns.distplot(跟踪)
轻视
plt.legend(标签=['Analytic','PyMC3','TFP'])
plt.xlim(-5,7);
我期望tfp、pymc3和分析解的结果相同(pymc3找到正确的后验值)


对于这类问题,随机游走并不是一个很好的取样器。你可能需要大量的样本才能接近真实的图像


PyMC使用NUTS——一种自适应哈密顿蒙特卡罗方法。TFP支持HMC(TFP.mcmc.hamiltonian-montecarlo);您应该能够将其替换为RWM(但您可能必须调整步长和蛙跳步长参数(这是NUTS自适应为您做的事情)。仅此一点就可以使您更接近一致的结果。

感谢您的回答@Chris。我确实很惊讶,即使是等待时间(增加样本数量)我没有得到任何有用的结果——因为我是第一次使用TFP,我认为我做错了什么。所以非常感谢你的解释。根据你的建议,我尝试了HMC,但仍然得到了类似的结果(很少)结果与RWM一致。您是否有任何快速建议来调整TFP中的步长和跳跃步长(因为螺母仍然不可用)?如果您仍在寻找:。现在就在这里!