【问题标题】:How to sample from a normal distribution random values inside a range using Tensorflow?如何使用 Tensorflow 从范围内的正态分布随机值中采样?
【发布时间】:2021-12-01 16:06:54
【问题描述】:

我有两个变量meanstddev,它们是形状为 (1,) 的张量,它们代表许多具有平均值的正态分布,比如 mean[i] 和标准差 stddev[i]。

从这些分布中,我想为每个人在 [low,up,] 的范围内采样一个值,然后我想获得采样值的对数概率。

docs 中,我发现experimental_sample_and_log_prob 方法几乎适合我,因为它不会对我想要的值范围(低、高)内的元素进行采样。

所以我编写了几行代码,但它自然不能很好地工作,而且计算量非常大。

import tensorflow as tf
from tensorflow_probability import distributions as tfd


def sample_and_log_prob(dist, up, down):
    samples = dist.sample()
    accepted = False
    print("Is {} accepted? {}".format(samples, accepted))
    while not accepted:
        # sample < up
        cond1 = tf.less_equal(samples, up)
        # sample > down
        cond2 = tf.greater_equal(samples, down)
        # if down < sample < up
        accepted = tf.logical_and(cond1, cond2) 
        samples = tf.where(
            tf.logical_not(accepted),
            samples,
            dist.sample())
        print("Is {} accepted? {}".format(samples, accepted))
    
    return samples, dist.log_prob(samples)


distribution = tfd.Normal(
    loc=mean ,
    scale=stddev,
    validate_args=True,
    allow_nan_stats=False)

samples, log_probs = sample_and_log_prob(distribution, up=-1, down=1)

有什么解决办法吗?

【问题讨论】:

  • “它不能很好地工作”不是编程语句。这是什么意思?您遇到的具体问题是什么?
  • 我的意思是它在计算方面非常昂贵。

标签: python tensorflow tensorflow-probability


【解决方案1】:

听起来你想要一个TruncatedNormal 分发。

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 2020-10-05
    • 2011-02-14
    • 1970-01-01
    • 2010-11-21
    • 2021-09-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多