1

这可能是非常基本的,但我无法弄清楚——我有一个y从 Dirichlet-Multinomial 生成的 100x5 矩阵,我想使用张量流概率推断参数 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 形状。我无法弄清楚如何正确指定模型——任何指针都将不胜感激。

4

1 回答 1

1

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

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

批次形状描述了独立的、非相同分布的绘图;一个“批次”的分布。例如,由于传递给参数Normal(loc=[1., 2., 3], scale=1.)的 3 个值,a 的 batch_shape 为 3 。loc

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

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

上面的大部分文字都是从这个很棒的笔记本中提取的,它有更多关于 TF 分布形状的细节。

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

于 2018-06-08T17:54:48.240 回答