#python #tensorflow #probability #probability-density #tensorflow-probability
#python #tensorflow #вероятность #плотность вероятности #тензорный поток-вероятность
Вопрос:
Меня интересуют особенности биекторов в tensorflow_probability, поэтому я попытался выполнить выборку из функции случайных величин, которая создается tfp.bijectors.
Я просто предоставляю свой тестовый код blow, и здесь я привожу некоторые подробности: случай, который я тестировал, — это распределение Chi_square. Я получил выборки из распределения Chi (2) двумя различными способами: (1) напрямую использую api Chi (2) в tensorflow; (2) используя tfp.bijectors по соотношению между Chi (2) и стандартным нормальным распределением (N (0, 1) ): если X, Y iid ~ N (0,1), Z = g (X, Y) = X ^ 2 Y ^ 2, то Z ~ Chi (2 ). Мой результат показал blow, средние значения выборок групп tow примерно равны, но стандартное отклонение tow намного больше отличается, кто-нибудь может сказать мне, где я ошибаюсь и как правильно использовать tf_probability?
import os
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_probability as tfp
from scipy.stats import chi2
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.reset_default_graph() # Clear computational graph before calc again!!!
tfd = tfp.distributions
tfb = tfp.bijectors
n_samples = 2000
chi2_origin = tfd.Chi2(2)
s_chi2_origin = chi2_origin.sample([n_samples])
base_normal = tfd.Normal(loc=0., scale=1.)
n_to_chi1_bij = tfb.Square()
n_to_chi2_bij = tfb.Chain([tfb.AffineScalar(shift=0., scale=2.), tfb.Square()])
target_Chi = tfd.TransformedDistribution(
distribution=base_normal,
bijector=n_to_chi2_bij,
name="Chi_x_constructed"
)
s_chi1_constru = target_Chi.sample([n_samples])
with tf.Session() as sess:
init_op = tf.local_variables_initializer()
sess.run(init_op)
s_chi2_origin_ = sess.run(s_chi2_origin)
# print("Samples by Chi2_ORIGIN", s_chi2_origin_)
print("Origin : mean={:.4f}, std={:.4f}".
format(s_chi2_origin_.mean(), s_chi2_origin_.std()))
s_chi2_constru_ = sess.run(s_chi1_constru)
# print("Samples by Chi1_CONSTRU:", s_chi1_constru_[-5:-1])
print("Constru: mean={:.4f}, std={:.4f}".
format(s_chi2_constru_.mean(), s_chi2_constru_.std()))
x = np.arange(0, 15, .5)
y = chi2(2).pdf(x)
fig, (ax0, ax1) = plt.subplots(1, 2, sharey=True, figsize=(6,4))
ax0.hist(s_chi2_origin_, bins='auto', density=True)
ax0.plot(x, y, 'r-')
ax1.hist(s_chi2_constru_, bins=200, density=True)
ax1.plot(x, y, 'r-')
plt.show()
И вот мой результат, исходная строка вычисляется непосредственно с помощью Chi (2) api в tf, левое изображение показывает исходный результат; строка определения и правое изображение получены с помощью tf_probability.bijectors.
Ответ №1:
Я думаю, что у вас записи в вашей цепочке поменялись местами. Они вызываются справа налево, как в математической записи композиции функций.