使用 JointDistributionSequential 的 Tensorflow 概率层次模型
Hierarchical model in Tensorflow probability using JointDistributionSequential
我正在尝试了解如何在 Tensorflow 概率中实现以下模型。
- 角度
theta
在 [-pi / 2, +pi / 2]
; 范围内具有统一的先验概率
- 方向翻转概率
beta
在 [0, 1]
范围内具有统一的先验概率;
theta'
设置为:
theta' = theta + pi
概率为 beta
;或
theta' = theta
概率为 (1 - beta)
;
- 浓度
c
具有 HalfCauchy 先验概率;和
- 观察
alpha
是从 von Mises distribution 中提取的,以 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: __init__() missing 1 required positional argument: 'total_count'
。我做错了什么?
2020-03-17 更新
最新代码如下。我仍在尝试找出如何实现我的模型的第 (3) 部分,即通过添加概率 beta
的 pi
来翻转我的角度 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
]
)
将伯努利换成二项式。二项式是 total_count
次伯努利抽取的总和。
在 loc
参数计算中将数字乘以分布的问题可以通过从伯努利分布中抽样来解决,即
...
loc=theta + np.pi*tfd.Bernoulli(probs=beta, dtype=tf.float32).sample(),
...
这允许从联合分布中抽样,但我不确定它是否正确。
另一种方法是提取 flip
随机变量并使用双射器进行缩放,即
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
]
)
这也允许从联合分布中采样,并且具有能够看到翻转何时发生的优势。
我正在尝试了解如何在 Tensorflow 概率中实现以下模型。
- 角度
theta
在[-pi / 2, +pi / 2]
; 范围内具有统一的先验概率
- 方向翻转概率
beta
在[0, 1]
范围内具有统一的先验概率; theta'
设置为:theta' = theta + pi
概率为beta
;或theta' = theta
概率为(1 - beta)
;
- 浓度
c
具有 HalfCauchy 先验概率;和 - 观察
alpha
是从 von Mises distribution 中提取的,以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: __init__() missing 1 required positional argument: 'total_count'
。我做错了什么?
2020-03-17 更新
最新代码如下。我仍在尝试找出如何实现我的模型的第 (3) 部分,即通过添加概率 beta
的 pi
来翻转我的角度 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
]
)
将伯努利换成二项式。二项式是 total_count
次伯努利抽取的总和。
在 loc
参数计算中将数字乘以分布的问题可以通过从伯努利分布中抽样来解决,即
...
loc=theta + np.pi*tfd.Bernoulli(probs=beta, dtype=tf.float32).sample(),
...
这允许从联合分布中抽样,但我不确定它是否正确。
另一种方法是提取 flip
随机变量并使用双射器进行缩放,即
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
]
)
这也允许从联合分布中采样,并且具有能够看到翻转何时发生的优势。