首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将tensorflow_probability分布用于多维空间?

如何将tensorflow_probability分布用于多维空间?
EN

Stack Overflow用户
提问于 2021-02-10 05:28:02
回答 1查看 79关注 0票数 0

我想用tensorflow创建一个多维高斯概率密度函数(假设是一个如下图所示的2D高斯)。

对于1D来说,它就像一个护身符:

代码语言:javascript
复制
d = tfp.distributions.Normal(loc=5.0, scale=3.0)
x = d.prob(tf.range(0,10, dtype=tf.float32))

但是对于更高的维度,我在使用NormalMultivariateNormalDiag分布时得到InvalidArgumentError: Incompatible shapes错误...我错过了什么?如何使用prob方法来输出多维张量上的概率密度函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 06:25:19

如果我没理解错的话,你可以这样做:

代码语言:javascript
复制
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就像这样:

代码语言:javascript
复制
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等在这里只是数组。它们将用于创建:

代码语言:javascript
复制
 mvn = tfd.MultivariateNormalDiag(
 loc=mv_normal_mean,
 scale_diag=mv_normal_stddev)

值可以如下所示:

代码语言:javascript
复制
mvn_mean
array([-0.03976356,  0.07387231])

代码语言:javascript
复制
mv_normal_cov
array([[ 1.04138867, -0.00877481],
       [-0.00877481,  0.97736496]])

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

代码语言:javascript
复制
x1, x2 = np.meshgrid(mv_normal[:,0], 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()

这将产生如下结果:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66127424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档