tensorflow_probability 分布应该如何用于多维空间?

问题描述

我想用张量流创建一个多维高斯概率密度函数(比如下图中的二维高斯函数)。

enter image description here

对于一维,它就像一个魅力:

_interceptors.response

但是对于更高的维度,我在使用 d = tfp.distributions.normal(loc=5.0,scale=3.0) x = d.prob(tf.range(0,10,dtype=tf.float32)) InvalidArgumentError: Incompatible shapes 分布时遇到 normal 错误...我错过了什么?应该如何使用MultivariatenormalDiag方法输出多维张量上的概率密度函数

解决方法

如果我理解正确,您可以执行以下操作:

mu = [0,0]
cov = [[1,0],[0,1]]
mv_normal = np.random.multivariate_normal(mu,cov,size=1000)
mv_normal_mean = np.mean(mv_normal,axis=0)
mv_normal_cov = np.cov(mv_normal,rowvar=0)
mv_normal_diag = np.diag(mv_normal_cov)
mv_normal_stddev = np.sqrt(mv_normal_diag)

mv_normal 就像:

mv_normal
array([[-1.73476374,0.17578855],[ 0.11866498,-0.66417069],[ 1.52000069,-1.3004096 ],...,[-1.37625595,-0.46864374],[ 0.81659449,0.70524036],[ 1.12183633,0.14196896]])

mv_normal_meanmv_normal_cov 等只是这里的数组。它们将用于创建:

 mvn = tfd.MultivariateNormalDiag(
 loc=mv_normal_mean,scale_diag=mv_normal_stddev)

值可以被视为:

mvn_mean
array([-0.03976356,0.07387231])

mv_normal_cov
array([[ 1.04138867,-0.00877481],[-0.00877481,0.97736496]])

您可以使用等高线图进行绘图。

x1,x2 = np.meshgrid(mv_normal[:,mv_normal[:,1])
data = np.stack((x1.flatten(),x2.flatten()),axis=1)
prob = mvn.prob(data).numpy()
plt.figure(figsize = (12,9))
ax = plt.axes(projection='3d')
ax.plot_surface(x1,x2,prob.reshape(x1.shape),cmap = 'Blues')
plt.show()

这将产生如下: enter image description here