Tensorflow实施多元学生T对角线分布

时间:2018-11-27 23:28:59

标签: python tensorflow tensorflow-probability

我正在实现对角多元学生t分布(所以logP(x1,x2,x3,.. xD)= logP(x1)+ logP(x2)+ .... + logP(xD))使得它可以用作TensorFlow中双射器的基本分布

import tensorflow_probability as tfp
tfd = tfp.distributions

D = 2 # number of dimension
df = 5. # degree of freedom

# construct D univariate student t distribution

base_dist = tfd.StudentT(loc=tf.constant([0.] * D,dtype=DTYPE),
                         scale = tf.constant([1.] * D,dtype=DTYPE),
                         df = tf.constant([df],dtype=DTYPE))

Q = tfd.TransformedDistribution(distribution=base_dist,bijector=Chain)
# where Chain is a tfb.Chain() object that a sequence of bisector numbers

我更改tfd.StudentT.log_prob()使其在最后一个轴上求和。它以形状[batch_size,dim]作为输入,并返回形状为[batch_size,]的pdf

但是,当我打电话给Q.log_prob(x)时;我收到错误消息ValueError: event_ndims (0) must be larger than min_event_ndims (1)

我不确定如何解决此错误;有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

TensorFlow概率提供了一种通过tfd.Independent元分布从标量分布创建向量值分布的方法。这样会自动在所需的log_prob中执行求和。

如果您真的想自己实现事物,那么您遇到的问题似乎是您没有覆盖event_shapeevent_shape_tensor方法(以及batch_shape和{{ 1}})。

最后,通常,当人们谈论多元学生t分布时,它们的意思是描述为here的椭圆分布,这与采用一维Student-t的乘积 不是同一件事分布,然后线性变换它们。最近,TFP添加了此分布here的椭圆变体的实现。它以仿射变换作为输入,可用于设置分布的位置/相关结构。