2015-12-04 3 views
0

У меня есть переменная A, которая распределена по Бернулли, A = pymc.Bernoulli('A', p_A), но у меня нет жесткого значения для p_A и вы хотите попробовать ее. Я знаю, что он должен быть небольшим, поэтому я хочу использовать экспоненциальное распределение p_A = pymc.Exponential('p_A', 10).Ввод ограничений на стохастические переменные в PyMC

Однако экспоненциальное распределение может возвращать значения, превышающие 1, что бы сбросить A. Есть ли способ ограничить вывод p_A без необходимости повторной реализации либо Бернулли, либо экспоненциальных распределений в моей собственной @pymc.stochastic -декорированной функции?

+0

Моя первая попытка была приблизиться к экспоненциальному распределению, используя бета-распределение, 'a = 1',' b> 1'. Вы также можете приблизить ограниченное распределение Пуассона. – Tunisia

ответ

0

Для любых других потерянных душ, которые приходят через это:

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

Для certain parameter values он аппроксимирует форму экспоненциальной функции (и может делать то же самое для биномов и нормалей), но ограничен до [0 1]. Наверное, полезно только для того, чтобы делать вещи численно, хотя, как я думаю, с болью делать какие-либо анализы.

3

Вы можете использовать детерминированную функцию для обрезания экспоненциального распределения. Лично я считаю, что было бы лучше, если вы используете дистрибутив, который связан между 0 и 1, а именно решить вашу проблему, то вы можете сделать следующее:

import pymc as pm 
p_A = pm.Exponential('p_A',10) 

@pm.deterministic 
def p_B(p=p_A): 
    return min(1, p) 

A = pm.Bernoulli('A', p_B) 

model = dict(p_A=p_A, p_B=p_B, A=A) 
S = pm.MCMC(model) 
S.sample(1000) 
p_B_trace = S.trace('p_B')[:]