2017-02-09 11 views
2

Каковы возвращаемые значения find_MAP в pymc3?Что означает вывод 'find_MAP' в pymc3?

Кажется, что переменные pymc3.Normal и pymc3.Uniform не считаются одинаковыми: для pymc3.Normal variables find_MAP возвращает значение, которое выглядит как максимальная апостериорная вероятность. Но для переменных pymc3.Uniform я получаю суффикс '_interval', добавленный к имени переменной, и я не нахожу где-либо в документе значение возвращаемого значения (что может показаться абсурдным, даже в пределах физических ограничений) ,

Например:

import numpy as np 
import pymc3 as pm3 
# create basic data such as obs = (x*0.95)**2+1.1+noise 
x=np.arange(10)+1 
obs=(x*0.95)**2+np.random.randn(10)+1.1 
# fitting the model y=a(1*x)**2+a0 on data points 
with pm3.Model() as model: 
    a0 = pm3.Uniform("a0",0,5) 
    a1 = pm3.Normal("a1",mu=1,sd=1) 
    a2 = pm3.Deterministic('a2',(x*a1)**2+a0) 
    hypothesis = pm3.Normal('hypothesis', mu=a2, sd=0.1, observed=obs) 
    start = pm3.find_MAP() 
print('start: ',start) 

возвращается:

Optimization terminated successfully. 
     Current function value: 570.382509 
     Iterations: 13 
     Function evaluations: 17 
     Gradient evaluations: 17 
start: {'a1': array(0.9461006484031161), 'a0_interval_': array(-1.0812715249577414)} 

ответ

3

По умолчанию pymc3 transforms некоторые переменные с ограниченной поддержкой множества действительных чисел. Это позволяет использовать множество операций, которые в противном случае могли бы заглушить при заданных ограниченных распределениях (например, некоторые методы оптимизации и выборки). Когда это автоматическое преобразование применяется, случайная величина, которую вы добавили в модель, становится дочерним элементом преобразованной переменной. Эта преобразованная переменная добавляется к модели с именем [var]_[transform]_.

Преобразование по умолчанию для равномерной случайной величины называется «интервальным преобразованием», а новое имя этой переменной - [name]_interval_. Оценка MAP является найденной путем оптимизации всех параметров, чтобы максимизировать заднюю вероятность. Нам нужно только оптимизировать преобразованную переменную, так как это полностью определяет значение переменной, которую вы первоначально добавили в модель. pm.find_MAP() возвращает только оптимизируемые переменные, а не исходные переменные. Обратите внимание, что a2 также не возвращается, так как он полностью определяется a0 и a1.

code, что pymc3 использует для интервала преобразования [^ 1]

def forward(self, x): 
    a, b = self.a, self.b 
    r = T.log((x - a)/(b - x)) 
    return r 

Где a нижняя граница, b есть верхняя грань, а x переменная преобразуется. Используя эту карту, значения, которые очень близки к нижней границе, преобразуют значения, приближающиеся к отрицательной бесконечности, а значения, очень близкие к верхней границе, приближают положительную бесконечность.

Зная границы, мы можем преобразовать обратно из реальной линии в ограниченный интервал. code что pymc3 использует для этого

def backward(self, x): 
    a, b = self.a, self.b 
    r = (b - a) * T.exp(x)/(1 + T.exp(x)) + a 
    return r 

Если применить эту задом трансформации себя, вы можете восстановить a0 себя:

(5 - 0) * exp(-1.0812715249577414)/(1 + exp(-1.0812715249577414)) + 0 = 1.26632733897

Другие преобразования автоматически применяются, включают log transform (для переменных ограничена на одна сторона) и stick-breaking transform (для переменных, сумма которых равна 1).

[^ 1] Начиная с фиксации 87cdd712c86321121c2ed3150764f3d847f5083c.

+1

thx! это должно быть четко указано в документе ... большой вопрос. –

+1

Согласен @ Стефан. PyMC3 имеет кучу функциональности, которая не является официальной, документированной частью API библиотеки. Я думаю, что авторы часто рефакторизуют, что они не уделяют первостепенное внимание современным документам. Если вам нравится мой ответ, не могли бы вы «принять» его? Благодаря! – bsmith89