Tensorflow 实现多元学生 T 对角分布

Tensorflow Implement Multivariate Student T diagonal distribution

我正在实现对角多元学生 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] 作为输入,return pdf 形状为 [batch_size,]

然而,当我调用 Q.log_prob(x);我收到错误 ValueError: event_ndims (0) must be larger than min_event_ndims (1)

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

TensorFlow Probability 提供了一种通过 tfd.Independent 元分布从标量分布创建向量值分布的方法。这将自动执行您想要的 log_prob 中的求和。

如果你真的想自己实现,你遇到的问题听起来像是你没有覆盖 event_shapeevent_shape_tensor 方法(以及 batch_shapebatch_shape_tensor).

最后,通常当人们谈论多元学生 t 分布时,他们指的是描述的椭圆分布 here, which is not the same thing as taking a product of 1D Student-t's distributions and then linearly transforming them. Recently, TFP added an implementation of the elliptical variant of this distribution here。它采用仿射变换作为输入,您可以使用它来设置分布的 location/correlation 结构。