CDF многомерного нормаля в тензорном потоке

1

Я хочу оценить cdf многомерного нормального распределения с использованием тензорного потока. То, что я пробовал до сих пор:

import tensorflow as tf
ds = tf.contrib.distributions

# Initialize a single 3-variate Gaussian.
mu = [0., 0., 0.]
cov = [[ 0.36,  0.12,  0.06],
       [ 0.12,  0.29, -0.13],
       [ 0.06, -0.13,  0.26]]
mvn = ds.MultivariateNormalFullCovariance(
    loc=mu,
    covariance_matrix=cov)
value = tf.constant([0., 0., 0.])


with tf.Session() as sess:
    print mvn.cdf(value).eval()

Это дает ошибку:

NotImplementedError: cdf is not implemented when overriding event_shape

Я не понимаю, почему я переопределяю event_shape, поскольку event_shape и форма значения одинаковы. Что я делаю неправильно?

Теги:
tensorflow
cdf

1 ответ

0
Лучший ответ

Ты ничего не делаешь неправильно. CDF не применяется для многомерного нормального режима. (Я согласен, что сообщение об ошибке запутывается. Сообщение об ошибке вызывается TransformedDistribution который отвечает за реализацию cdf.)

Если вы можете терпеть приближение Монте-Карло, я предлагаю сделать что-то вроде:

def approx_multivariate_cdf(dist, bound, num_samples=int(100e3), seed=None):
  s = dist.sample(num_samples, seed=seed)
  in_box = tf.cast(tf.reduce_all(s <= bound, axis=-1), dist.dtype)
  return tf.reduce_mean(in_box, axis=0)

(С некоторой мыслью, я уверен, что кто-то может сделать лучше, чем это.)

Также может быть более умное решение, описанное здесь: https://arxiv.org/abs/1603.04166

Ещё вопросы

Сообщество Overcoder
Наверх
Меню