Отрицательные значения неотрицательного параметра в вероятности тензорного потока - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь вписать простую модель Дирихле-Мультома в вероятность тензорного потока.Параметры концентрации gamma, и я поместил гамма (1,1) до их распределения.Это модель, где S - это число категорий, а N - количество выборок:

def dirichlet_model(S, N):
    gamma = ed.Gamma(tf.ones(S)*1.0, tf.ones(S)*1.0, name='gamma')
    y = ed.DirichletMultinomial(total_count=500., concentration=gamma, sample_shape=(N), name='y')
    return y

log_joint = ed.make_log_joint_fn(dirichlet_model)

Однако, когда я пытаюсь сделать выборку из этого с использованием HMC, коэффициент приема равен нулю, и начальнаяDraw для gamma содержит отрицательные значения.Я делаю что-то неправильно?Не должны ли отрицательные предложения по параметрам концентрации автоматически отклоняться?Ниже мой код выборки:

def target_log_prob_fn(gamma):
  """Unnormalized target density as a function of states."""
  return log_joint(
    S=S, N=N,
    gamma=gamma,
    y=y_new)

num_results = 5000
num_burnin_steps = 3000

states, kernel_results = tfp.mcmc.sample_chain(
  num_results=num_results,
  num_burnin_steps=num_burnin_steps,
  current_state=[
    tf.ones([5], name='init_gamma')*5,
],
kernel=tfp.mcmc.HamiltonianMonteCarlo(
    target_log_prob_fn=target_log_prob_fn,
    step_size=0.4,
    num_leapfrog_steps=3))

gamma = states

with tf.Session() as sess:
  [
    gamma_,
    is_accepted_,
  ] = sess.run([
    gamma,
    kernel_results.is_accepted,
  ])

num_accepted = np.sum(is_accepted_)
print('Acceptance rate: {}'.format(num_accepted / num_results))

1 Ответ

0 голосов
/ 09 июня 2018

Попробуйте уменьшить размер шага, чтобы увеличить скорость приема.Оптимальный коэффициент принятия для HMC составляет около .651 (https://arxiv.org/abs/1001.4460). Не уверен, почему вы видите отрицательные значения. Возможно, ошибка с плавающей запятой близка к нулю? Можете ли вы опубликовать некоторые из журналов своего прогона?

...