Tensorflow 中多变量法线的 CDF
CDF of a multivariate Normal in Tensorflow
我想使用 tensorflow 评估多元正态分布的 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 未针对多元正态分布实施。 (我同意错误消息令人困惑。错误消息是由负责实施 cdf
的 TransformedDistribution
抛出的。)
如果您可以接受 Monte Carlo 近似值,我建议您这样做:
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
我想使用 tensorflow 评估多元正态分布的 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 未针对多元正态分布实施。 (我同意错误消息令人困惑。错误消息是由负责实施 cdf
的 TransformedDistribution
抛出的。)
如果您可以接受 Monte Carlo 近似值,我建议您这样做:
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