【问题标题】:How should tensorflow_probability distributions be used for multi-dimensional spaces?tensorflow_probability 分布应该如何用于多维空间?
【发布时间】:2021-02-09 21:28:01
【问题描述】:

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

对于 1D,它就像一个魅力:

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方法应该如何输出多维张量上的概率密度函数?

【问题讨论】:

    标签: python tensorflow probability-density tensorflow-probability


    【解决方案1】:

    如果我理解正确,你可以这样做:

    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[:,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()
    

    这将产生如下:

    【讨论】:

    • 谢谢。实际上我错过的是我测试时错误的频道顺序。
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2010-10-12
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多