【问题标题】:Specifying a DirichletMultinomial in tensorflow probability在张量流概率中指定 DirichletMultinomial
【发布时间】:2018-06-07 16:12:01
【问题描述】:

这可能是非常基本的,但我无法弄清楚——我有一个从 Dirichlet-Multinomial 生成的 100x5 矩阵y,我想使用张量流概率推断参数 gamma。下面是我实现的模型(为简单起见,我假设现在所有 5 个类的 gamma 都是相同的):

def dirichlet_multinomial_model(S, p, N, tau):
    gamma = ed.Gamma(2.0, 3.0, name='gamma')
    y = ed.DirichletMultinomial(500, tf.ones(5)*gamma, name='y')
    return y

log_joint = ed.make_log_joint_fn(dirichlet_multinomial_model)

def target_log_prob_fn(gamma):
  return log_joint(
     S=S, p=p, N=N, tau=tau,
     gamma=gamma,
     y=y)

当我尝试使用 HMC 从中采样时,我收到以下错误:

ValueError:初始化参数“值”的形状不兼容。预期 (5,),得到 (100, 5)。

因此,指定一个长度为 5 的伽马向量似乎导致程序期望我的数据具有 5x1 的形状。我无法弄清楚如何正确指定模型 - 任何指针都将不胜感激。

【问题讨论】:

  • 你能试试sample_shape=(100)吗?
  • 啊,这似乎可行——出于某种原因,我认为我必须指定(100,5) 作为样本的形状。我确实收到了一个新错误,但我认为这现在可能与输入数据的类型有关:TypeError: Value passed to parameter 'x' has DataType int32 not in list of allowed values: bfloat16, float16, float32, float64?
  • 解决了这个问题——出于某种原因,500 的total_count 需要是浮点数而不是整数。感谢您的帮助,如果您将其发布为答案,我会将其标记为正确的。

标签: python python-3.x tensorflow-probability


【解决方案1】:

正如我在评论中所暗示的,这里的解决方法是使用sample_shape=[100,] 而不是sample_shape=[100, 5]。我们在 TF Distributions 库(Edward 封装)中有 3 个形状概念:样本形状、批处理形状和事件形状。

事件形状描述了从分布中单次绘制的形状。比如一个5维的多元正态分布有event_shape=[5,]

batch shape 描述了独立的、不同分布的抽奖;一个“批次”的分布。例如,Normal(loc=[1., 2., 3], scale=1.) 的 batch_shape 为 3,因为传递给 loc 参数的 3 个值。

样本形状描述了从批次分布中抽取的 IID。生成的采样Tensor 具有形状S + B + E,其中SBE 分别是样本、批处理和事件形状。

在您的示例中,DirichletMultinomial 具有形状为 [5,] 的浓度参数。这对应于分布的事件形状:来自该分布的每次抽奖都将是 5 个整数的集合,加起来为total_count。当您对分布进行 100 次采样时,您确实会得到 shape=[100, 5] 的结果,但 5 隐含在分布的事件形状中——您只抽取 100 个样本,因此 sample_shape=[100,]

以上大部分文字来自this great notebook,其中包含更多关于 TF 分布形状的详细信息。

希望这有助于澄清事情!取样愉快! ^_^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多