многомерное нормальное распределение с n-пакетом › 1

Я пытаюсь обобщить пример, приведенный в Как использовать распределение MultiVariateNormal в последней версии Tensorflow для нормального распределения в 2D, но с более чем одним пакетом. Когда я запускаю следующее:

from tensorflow_probability import distributions as tfd
import tensorflow as tf

tf.compat.v1.enable_eager_execution()

mu = [[1, 2],
        [-1,-2]]

cov = [[1, 3./5],
        [3./5, 2]]

cov = [cov, cov] # for demonstration purpose, use same cov for both batches

mvn = tfd.MultivariateNormalFullCovariance(
        loc=mu,
        covariance_matrix=cov)

# generate the pdf
X, Y = tf.meshgrid(tf.range(-3, 3, 0.1), tf.range(-3, 3, 0.1))
idx = tf.concat([tf.reshape(X, [-1, 1]), tf.reshape(Y,[-1,1])], axis =1)
prob = tf.reshape(mvn.prob(idx), tf.shape(X))

Я получаю сообщение об ошибке «Несовместимые формы»:

tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [3600,2] vs. [2,2] [Op:Sub] name: MultivariateNormalFullCovariance/log_prob/affine_linear_operator/inverse/sub/

Мое понимание документации (https://www.tensorflow.org/api_docs/python/tf/contrib/distributions/MultivariateNormalFullCovariance) заключается в том, что для вычисления PDF требуется тензор [n_observation, n_dimensions] (как в этом примере: idx.shape = TensorShape([Dimension(3600), Dimension(2)])). Я ошибся в математике?


person Wfarah    schedule 28.07.2019    source источник


Ответы (1)


Вам нужно добавить пакетную ось к тензору idx в предпоследней позиции, поскольку 60x60 не может транслироваться против mvn.batch_shape из (2,).

# TF/TFP Imports
!pip install --quiet tfp-nightly tf-nightly
import tensorflow.compat.v2 as tf
tf.enable_v2_behavior()
import tensorflow_probability as tfp
tfd = tfp.distributions

mu = [[1, 2],
      [-1, -2]]

cov = [[1, 3./5],
       [3./5, 2]]

cov = [cov, cov] # for demonstration purpose, use same cov for both batches

mvn = tfd.MultivariateNormalFullCovariance(
    loc=mu, covariance_matrix=cov)
print(mvn.batch_shape, mvn.event_shape)

# generate the pdf
X, Y = tf.meshgrid(tf.range(-3, 3, 0.1), tf.range(-3, 3, 0.1))
print(X.shape)
idx = tf.stack([X, Y], axis=-1)[..., tf.newaxis, :]
print(idx.shape)

probs = mvn.prob(idx)
print(probs.shape)

выход:

(2,) (2,)   # mvn.batch_shape, mvn.event_shape
(60, 60)    # X.shape
(60, 60, 1, 2)   # idx.shape == X.shape + (1 "broadcast against batch", 2 "event")
(60, 60, 2)  # probs.shape == X.shape + (2 "mvn batch shape")
person Brian Patton    schedule 01.08.2019
comment
Спасибо. Имеет смысл для меня сейчас! В конечном итоге я хотел смешать два дистрибутива. tfd.MixtureSameFamily сделал свое дело - person Wfarah; 02.08.2019