Правильное получение входных размеров в pymc3

Скажем, у меня есть 10 монет одного монетного двора, я переворачиваю их каждые 50 раз, теперь я хочу оценить смещение монетного двора, а также индивидуальное смещение всех монет.

То, как я хочу сделать это, выглядит следующим образом:

# Generate a list of 10 arrays with 50 flips in each
test = [bernoulli.rvs(0.5, size=50) for x in range(10)]

with pm.Model() as test_model:
    k = pm.Gamma('k', 0.01, 0.01) + 2
    w = pm.Beta('w', 1, 1)

thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = len(test))
y = pm.Bernoulli('y', thetas, observed=test)

Но это не работает, потому что теперь кажется, что pymc ожидает 50 монет при 10 бросках. Я могу взломать эту проблему в этом случае. Но я новичок в python и pymc (3), поэтому я хочу узнать, почему он ведет себя так и как должна выглядеть правильная симуляция этой ситуации.


person Jon Sjöberg    schedule 30.05.2016    source источник


Ответы (1)


Если вы новичок в Python, возможно, вы не знакомы с концепцией broadcasting, который используется при работе с массивами NumPy, а также полезен для определения моделей PyMC3. Вещание позволяет нам арифметически работать с массивами разного размера при определенных обстоятельствах.

Для вашего конкретного примера проблема заключается в том, что в соответствии с правилами вещания форма вектора данных и форма тета-вектора несовместимы. Самое простое решение вашей проблемы - транспонировать вектор данных (сделать столбцы строк и строки столбцов). Обратите также внимание, что с помощью SciPy вы можете создавать фиктивные данные без использования понимания списка, вам просто нужно передать правильную форму.

test = bernoulli.rvs(0.5, size=(50, 10))


with pm.Model() as test_model:
    k = pm.Gamma('k', 0.01, 0.01) + 2
    w = pm.Beta('w', 1, 1)
    thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = test.shape[1])
    y = pm.Bernoulli('y', thetas, observed=test)
person aloctavodia    schedule 31.05.2016