Я пытаюсь понять, как реализовать следующую модель в вероятности Tensorflow.
- Угол,
theta
, имеет одинаковую априорную вероятность в диапазоне [-pi / 2, +pi / 2]
; - Вероятность смены направления,
beta
, имеет одинаковую априорную вероятность в диапазоне [0, 1]
; theta'
устанавливается либо: theta' = theta + pi
с вероятностью beta
; или theta' = theta
с вероятностью (1 - beta)
;
- Концентрация
c
имеет предварительную вероятность HalfCauchy; и - Наблюдение
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: __init__() missing 1 required positional argument: 'total_count'
. Что я делаю не так?
Обновлено 2020-03-17
Последний код выглядит следующим образом. Я все еще пытаюсь выяснить, как реализовать часть (3) моей модели, то есть изменить направление моего угла, theta
, добавив pi
с вероятностью beta
. Любая помощь в этом будет оценена! То, что у меня есть, не работает, потому что я не могу умножить объект Бернулли на число с плавающей точкой.
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
]
)