Как установить параметры распределения Бернулли в pymc3

У меня есть модель, описанная в pymc3, с использованием следующего:

from pymc3 import * 
basic_model = Model()

with basic_model:
    # Priors for unknown model parameters
    alpha = Normal('alpha', mu=0, sd=10)
    beta = Normal('beta', mu=0, sd=10, shape=18)
    sigma = HalfNormal('sigma', sd=1)

    # Expected value of outcome
    mu = alpha + beta[0]*X1 + beta[1]*X2 + beta[2]*X3

    # Likelihood (sampling distribution) of observations
    Y_obs = Normal('Y_obs', mu=mu, sd=sigma, observed=Y)

Однако мои Y не распределены нормально, а являются бинарными (я думаю, Бернулли). Я не могу понять, как изменить Normal распределение Y на Bernoulli, потому что я не могу понять, какие параметры будут у Y_obs в этом случае.


person recluze    schedule 15.09.2015    source источник


Ответы (1)


Вам нужна логистическая регрессия. Здесь вы используете логистическую функцию для преобразования вывода вашей линейной модели в вероятность.

В вашем примере это может быть указано следующим образом:

import pyMc3 as pm
import theano.tensor as T
basic_model = pm.Model()

def logistic(l):
    return 1 / (1 + T.exp(-l))

with basic_model:
    # Priors for unknown model parameters
    alpha = pm.Normal('alpha', mu=0, sd=10)
    beta = pm.Normal('beta', mu=0, sd=10, shape=18)

    # Expected value of outcome
    mu = alpha + beta[0]*X1 + beta[1]*X2 + beta[2]*X3

    # Likelihood (sampling distribution) of observations
    Y_obs = pm.Bernoulli('Y_obs', p=logistic(mu), observed=Y)
person Kiudee    schedule 15.09.2015
comment
Спасибо. Это имеет смысл (хотя я знаю о логистической регрессии, но я не мог понять, как смоделировать это байесовским способом). Я попробую ваши изменения прямо сейчас и опубликую здесь, как это происходит. - person recluze; 15.09.2015
comment
Что ж, это работает, но я получаю точные значения для всех beta со стандартным отклонением 0.00 для всех из них! Я даже не уверен, какой вопрос задать здесь, чтобы продолжить, но я уверен, что делаю что-то не так :( ... (Моя цель - просто получить некоторое представление о моих данных - чисто исследовательская) - person recluze; 15.09.2015
comment
Похоже, что сэмплер испытывает трудности с приемом новых точек для сэмплирования. Какой семплер вы используете и как устанавливаете начальную точку? здесь приведен пример логистической регрессии с pymc3, который вы можете попробовать. - person Kiudee; 15.09.2015
comment
Это был отличный указатель. Я зашел в эту папку github, но пропустил файл logistic.py. Это очень помогло. Теперь я хорошо тренируюсь с базовой find_map отправной точкой и семплером NUTS. - person recluze; 16.09.2015