Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 基于联合分布序列的张量流概率分层模型_Tensorflow_Tensorflow Probability_Hierarchical Bayesian - Fatal编程技术网

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

我试图理解如何在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 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