Tensorflow 基于联合分布序列的张量流概率分层模型
我试图理解如何在Tensorflow概率中实现以下模型Tensorflow 基于联合分布序列的张量流概率分层模型,tensorflow,tensorflow-probability,hierarchical-bayesian,Tensorflow,Tensorflow Probability,Hierarchical Bayesian,我试图理解如何在Tensorflow概率中实现以下模型 角度θ在[-pi/2,+pi/2]范围内具有一致的先验概率 方向翻转概率,beta,在范围[0,1]内具有一致的先验概率 theta'设置为: theta'=theta+pi概率beta;或 theta'=theta概率(1-β) 浓度c具有半柯西先验概率;及 一个观察值,alpha是从以theta'为中心,浓度c得出的 到目前为止我试过的是 import tensorflow_probability as tfp import num
[-pi/2,+pi/2]
范围内具有一致的先验概率李>
beta
,在范围[0,1]
内具有一致的先验概率李>
theta'
设置为:
概率theta'=theta+pi
;或beta
概率theta'=theta
李>(1-β)
c
具有半柯西先验概率;及alpha
是从以theta'
为中心,浓度c
得出的import tensorflow_probability as tfp
import numpy as np
tfd = tfp.distributions
model = tfd.JointDistributionSequential(
[
tfd.Uniform(-np.pi / 2, +np.pi / 2, name='theta'), # theta
tfd.Uniform(0.0, 1.0, name='beta'), # beta
tfd.HalfCauchy(loc=0, scale=1), # c
lambda c, beta, theta: tfd.VonMises(
loc=theta + np.pi * tfd.Binomial(probs=beta),
concentration=c,
name='observed'
), # Observation, alpha
]
)
调用此函数会导致二项式部分出错:TypeError:\uuu init\uuu()缺少1个必需的位置参数:“total\u count”
。我做错了什么
更新日期:2020-03-17
最新代码如下。我仍在试图找到如何实现我的模型的第(3)部分,即通过添加概率为β的π来反转角度的方向,theta
。在此方面的任何帮助都将不胜感激!到目前为止,我的方法不起作用,因为我不能用浮点数乘以伯努利对象
model = tfd.JointDistributionSequential(
[
tfd.Uniform(-np.pi / 2, +np.pi / 2, name='theta'), # theta
tfd.Uniform(0.0, 1.0, name='beta'), # beta
tfd.HalfCauchy(loc=0, scale=1), # c
lambda c, beta, theta: tfd.VonMises(
loc=theta + np.pi * tfd.Bernoulli(probs=beta, dtype=tf.float32),
concentration=c,
name='observed'
), # Observation, alpha
]
)
把伯努利换成二项式。二项式是伯努利抽取次数的总和。在
loc
参数计算中,将一个数字乘以一个分布的问题可以通过从伯努利分布(即
...
loc=theta + np.pi*tfd.Bernoulli(probs=beta, dtype=tf.float32).sample(),
...
这允许从联合分布中进行采样,但我不确定它是否正确
另一种方法是拉出翻转
随机变量,并使用双喷射器进行缩放,即
tpb = tfp.bijectors
model = tfd.JointDistributionSequential(
[
tfd.Uniform(-np.pi / 2, +np.pi / 2, name='theta'), # theta
tfd.Uniform(0.0, 1.0, name='beta'), # beta
lambda beta, theta: tfb.Scale(np.pi)(tfd.Bernoulli(probs=beta, dtype=tf.float32)), #flip
tfd.HalfCauchy(loc=0, scale=1), # c
lambda c, flip, beta, theta: tfd.VonMises(
loc=theta + flip ,
concentration=c,
name='observed'
), # Observation, alpha
]
)
这还允许从联合口述中进行采样,并具有能够看到翻转何时发生的优点。顺便说一句,如果您每晚使用
tfp
,我建议查看一些JointDistribution*自动配接的类。这里是文档。谢谢-我需要使用伯努利而不是二项式。如何在模型中实现步骤(3)(根据伯努利图将θ’设置为θ+π)。我所做的不正确,因为它为*:“float”和“Bernoulli”引发了不受支持的操作数类型。
将dtype=tf.float32传递给构造函数。对不起,我还是不太明白。我现在使用theta+np.pi*tfd.Bernoulli(probs=beta,dtype=tf.float32)
来设置VonMises的loc
,但仍然会得到相同的错误。[参见Matt McDonnell的答案。]我认为第二种方法可能更好,不过现在请注意,您有一个离散值,这将使采样变得困难。您可以尝试RelaxedBernoulli获得浓度在0和1之间的连续0-1值。我想您可能需要使用MixtureSameFamily
?