Как реализовать в PyMC функцию случайной величины, которую может взять MCMC Metropolis?

Если у вас есть случайная величина $X$ и функция $f$, вы можете определить $y=f(X)$ как новую случайную величину с функцией плотности вероятности следующим образом:

$p(y)=(f^{-1})'(y)p(x)$. Подробнее см. здесь.

Теперь я определил случайную величину альфа с экспоненциальным распределением в следующем коде. Я хочу добавить в свою модель log(alpha) в качестве новой случайной величины. Как мне реализовать это в моей модели?

Я уже приложил усилия, но кажется, что это неправильно, и причина, указанная в ответах, заключается в том, что я использовал стохастический декоратор, а не детерминированный. Но поскольку позже я хочу применить MCMC Metropolis к этой переменной, мне нужно, чтобы она была статистической! Чтобы уточнить это, я хочу применить предложение Гаусса к журналу (альфа). Так что мне нужно ввести стохастический ввод в функцию Метрополиса.

Итак, это моя модель:

import numpy as np
import pymc
lambd=1;
__all__=['alpha']
alpha=pymc.Exponential('alpha', beta=lambd)

@pymc.stochastic(plot=False)
def logalpha(value=0,c=alpha):
    return np.log(c)

person Cupitor    schedule 17.10.2013    source источник
comment
Предполагается ли, что logalpha является log стохастической переменной alpha, или вы предполагаете, что она будет независимой переменной?   -  person bogatron    schedule 17.10.2013
comment
Я хочу, чтобы он представлял журнал стохастической переменной альфа, но я также хочу иметь возможность его выборки.   -  person Cupitor    schedule 17.10.2013


Ответы (2)


log alpha — это детерминированная функция вашей альфы, поэтому вы должны смоделировать ее как @deterministic. Хорошим игровым примером, отражающим вашу проблему, является пример регрессии.

person Max    schedule 17.10.2013
comment
проблема в том, когда я делаю это детерминированным. Я не могу сэмплировать оттуда. - person Cupitor; 17.10.2013
comment
PyMC должен накапливать выборки даже для детерминированных переменных. В вашем примере model.trace('logalpha')[:] должен дать вам образцы. - person Max; 17.10.2013
comment
Я отредактировал свой вопрос. Что мне нужно, так это иметь возможность применять мегаполис MCMC к логарифму (альфа), а не к альфе! - person Cupitor; 17.10.2013
comment
@Naji, выборка из альфа-канала и применение log() аналогичны выборке непосредственно из журнала (альфа) - person Cam.Davidson.Pilon; 17.10.2013
comment
@Cam.Davidson.Pilon, я это понимаю. Поскольку я использую предложение Гаусса и применяю его к журналу (альфа), мне нужно применить мой метод выборки к журналу (альфа), используя use_step_method. - person Cupitor; 17.10.2013
comment
Какова ваша конечная цель? Зачем вам нужно использовать предложения Гаусса? - person Cam.Davidson.Pilon; 17.10.2013
comment
@Cam.Davidson.Pilon, поскольку экспоненциальная функция неограничена, я пытаюсь использовать предложение Гаусса для ее оценки по мегаполисам. Я не хочу, чтобы PyMC пробовал его для меня. - person Cupitor; 17.10.2013

Как уже упоминалось @Max, logalpha должна быть детерминированной переменной, поскольку ее значение однозначно определяется alpha. Всякий раз, когда ваша модель сэмплируется, значение logalpha будет обновляться соответствующим образом. Например:

>>> import numpy as np
>>> import pymc
>>> lambd = 1
>>> 
>>> alpha = pymc.Exponential('alpha', beta=lambd)
>>> 
>>> @pymc.deterministic(plot=False)
... def logalpha(value=0, c=alpha):
...     return np.log(c)
... 
>>> M = pymc.Model([alpha, logalpha])
>>> for i in range(3):
...     M.draw_from_prior()
...     print (alpha.value, logalpha.value)
... 
(array(1.888410537018971), 0.63573548954043602)
(array(0.23180935966225977), -1.4618399707110767)
(array(0.3381518219555991), -1.0842603069656513)
person bogatron    schedule 17.10.2013
comment
спасибо за ваш ответ, но я хочу иметь возможность сэмплировать сам журнал (альфа) с помощью MCMC Metropolis с настраиваемым распределением предложений (в моем случае по Гауссу) - person Cupitor; 17.10.2013
comment
Я не понимаю, как это мешает вам сделать это. Но вы также можете просто создать свою переменную как переменную lognormal_like pymc (pymc- devs.github.io/pymc/). - person bogatron; 17.10.2013
comment
Детерминированная переменная не может быть передана в качестве параметра метода use_step_method. Я думаю, вы не можете определить случайную переменную из логарифмически нормального распределения. Даже если бы вы могли, это отличалось бы от альфа-случайной переменной, которую я определил. - person Cupitor; 17.10.2013