Как указать размер дистрибутива Бернулли с помощью pymc3? - PullRequest
0 голосов
/ 07 ноября 2018

Пытаясь пробиться через байесовские методы для хакеров, которые находятся в pymc, я наткнулся на этот код:

first_coin_flips = pm.Bernoulli("first_flips", 0.5, size=N)

Я пытался перевести это в pymc3 с помощью следующего, но он просто возвращает массив с пустым фрагментом, а не тензор (?):

first_coin_flips = pm.Bernoulli("first_flips", 0.5).random(size=50)

Причина, по которой размер имеет значение, заключается в том, что он используется позже в детерминированной переменной. Вот полный код, который у меня есть:

import pymc3 as pm
import matplotlib.pyplot as plt
import numpy as np
import mpld3
import theano.tensor as tt

model = pm.Model()
with model:
    N = 100
    p = pm.Uniform("cheating_freq", 0, 1)
    true_answers = pm.Bernoulli("truths", p)
    print(true_answers)
    first_coin_flips = pm.Bernoulli("first_flips", 0.5)
    second_coin_flips = pm.Bernoulli("second_flips", 0.5)
    #  print(first_coin_flips.value)

    # Create model variables
    def calc_p(true_answers, first_coin_flips, second_coin_flips):
        observed = first_coin_flips * true_answers + (1-first_coin_flips) * second_coin_flips
        # NOTE: Where I think the size param matters, since we're dividing by it
        return observed.sum() / float(N)

    calced_p = pm.Deterministic("observed", calc_p(true_answers, first_coin_flips, second_coin_flips))
    step = pm.Metropolis(model.free_RVs)
    trace = pm.sample(1000, tune=500, step=step)
    pm.traceplot(trace)

    html = mpld3.fig_to_html(plt.gcf())
    with open("output.html", 'w') as f:
        f.write(html)
        f.close()

А на выходе:

Output

Монета переворачивается и равномерный вывод cheating_freq выглядит правильно, но observed не выглядит для меня чем-то, и я думаю, что это потому, что я неправильно перевожу этот size параметр.

1 Ответ

0 голосов
/ 07 ноября 2018

pymc3 способ указать размер распределения Бернулли с помощью параметра shape, например:

first_coin_flips = pm.Bernoulli("first_flips", 0.5, shape=N)
...