Я хочу оценить 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 и форма значения одинаковы. Что я делаю неправильно?
Ты ничего не делаешь неправильно. 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