Как pymc представляет функцию априорного распределения и правдоподобия?

Если pymc реализует алгоритм Метрополиса-Гастингса для получения выборок из апостериорной плотности по интересующим параметрам, то для того, чтобы решить, переходить ли к следующему состоянию в цепи Маркова, он должен быть в состоянии оценить что-то, пропорциональное апостериорной плотности. плотность для всех заданных значений параметров.

Апостериорная плотность пропорциональна функции правдоподобия, основанной на умножении наблюдаемых данных на априорную плотность.

Как каждый из них представлен в pymc? Как он вычисляет каждую из этих величин из объекта модели?

Интересно, может ли кто-нибудь дать мне высокоуровневое описание подхода или указать мне, где я могу его найти.


person user18297    schedule 23.05.2013    source источник
comment
Принимая во внимание, что никто, кажется, не может вам ответить, я предлагаю спросить здесь: github.com/ pymc-devs/pymc/issues   -  person pablofiumara    schedule 27.03.2014


Ответы (1)


Для представления априора вам нужен экземпляр класса Stochastic, который имеет два основных атрибута:

value : the variable's current value
logp : the log probability of the variable's current value given the values of its parents

Вы можете инициализировать априор именем используемого вами дистрибутива.

Чтобы представить вероятность, вам нужен так называемый стохастический анализ данных. То есть экземпляр класса Stochastic, чей флаг observed установлен на True. Значение этой переменной нельзя изменить, и она не будет выбрана. Опять же, вы можете инициализировать вероятность именем используемого вами дистрибутива (но не забудьте установить флаг observed в True).

Скажем, у нас есть следующая установка:

import pymc as pm
import numpy as np
import theano.tensor as t

x = np.array([1,2,3,4,5,6])
y = np.array([0,1,0,1,1,1])

Мы можем запустить простую логистическую регрессию со следующим:

with pm.Model() as model:
    #Priors
    b0 = pm.Normal("b0", mu=0, tau=1e-6)
    b1 = pm.Normal("b1", mu=0, tau=1e-6)
    #Likelihood
    z = b0 + b1 * x
    yhat = pm.Bernoulli("yhat", 1 / (1 + t.exp(-z)), observed=y)
    # Sample from the posterior
    trace = pm.sample(10000, pm.Metropolis())

Большая часть вышеперечисленного взята из блокнота iPython Криса Фоннесбека здесь.

person jbencook    schedule 28.03.2014
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - person Brian S; 28.03.2014
comment
Бен, вы смешиваете нотацию pymc2 и pymc3. observed=true был для pymc2. Затем нужно было указать значение в value. pymc3 объединяет эти два ключевых слова, и данные передаются непосредственно с помощью observed=y, что подразумевает (наблюдается = истина). - person Ramon Crehuet; 30.11.2015
comment
что, если b0 — вектор и все его элементы независимы. то есть априор можно записать как произведение плотностей? Как вы пишете это в pymc? - person Harit Vishwakarma; 05.02.2016