【问题标题】:How can I create an array of distributions in TensorFlow Probability?如何在 TensorFlow Probability 中创建分布数组?
【发布时间】:2019-03-20 10:31:46
【问题描述】:

我正在尝试使用 Tensorflow Probability 编写代码,以使用 EM 算法对一组样本(来自多个高斯分布)进行分类。

因为我想为任何一般问题编写此代码(如果样本来自 2 个高斯分布或 8 个高斯分布,我希望它能够工作)。

我现在遇到的问题是 我找不到创建tfd.Normal 数组的方法

我想将它作为一个数组(或其他类似类型的数据),因为这样我可以处理不确定数量的分布。

谁能帮我解决这个问题?

下面的代码可以解决吗?

true_mu = np.array([20,60], dtype=np.float64)
true_sigma = np.array([8,4], dtype=np.float64)  
true_dist = tfd.Normal(loc=true_mu, scale=true_sigma)

【问题讨论】:

标签: python tensorflow data-science tensorflow-probability


【解决方案1】:

TFP 分发是开箱即用的批处理功能。您的代码应该可以工作,并且代表 2 个正态分布的向量,其中第一个是 N(X|20, 8),第二个是 N(X|60, 4)

您可以通过true_dist.batch_shape 进行查询(在这种情况下将返回[2])。

您现在可以采样:true_dist.sample()(返回一个 float64,形状为 [2])。

您可以计算概率:true_dist.log_prob(0)(返回一个 float64,形状为 [2],代表[log N(0|20, 8), log N(0|60, 4)])。

您可以估计每个批次成员的独立概率:true_dist.log_prob([0, 1])(返回一个float64,形状为[2],代表[log N(0|20, 8), log N(1|60, 4)])。

还要注意 TFP 分布广播它们的参数,所以如果你想要两个具有相同 loc 和不同比例的法线,你可以写 tfd.Normal(0, [10, 20])

【讨论】:

  • 谢谢!你知道是否有办法生成 1 个分布的 200 个样本和另一个分布的 500 个样本?我找到的唯一方法是:1. 生成 500 个样本,第一个样本取前 200 个,丢弃其他 300 个。2. 生成 500 个样本,只取第二列,生成 200 个样本,只取第一列。
  • 你可以写d[0].sample(200), d[1].sample(500),但是注意分布切片是一个新特性,你需要使用pip install tfp-nightly
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多