Определите пользовательский априор для каждого параметра в emcee

У меня есть функция с тремя параметрами a,b а также c и я хочу определить различные приоры для каждого из этих параметров. Я использую emcee пакет.

Я начал с простой униформы (неинформативной):

def lnprior(theta):
    m, b, c = theta
    if 1.0 < m < 2.0 and 1.0 < b < 2.0 and 1.0 < c < 2.0:
        return 0.0
    return -np.inf

Я бы хотел, чтобы для каждого параметра был свой приоритет. Например, для a Я хотел бы иметь нормальный (му, сигма) до, в то время как для b униформа и для c Джеффри до (1/c), До сих пор я выхожу со следующим:

def lnprior(theta):
    a, b, c = theta

    mu = 0.5 # mean of the Normal prior
    sigma = 0.1 # standard deviation of the Normal prior

if not (1.0 < b < 2.0): # the bound on the uniform
    return -np.inf
if c < 0.0:             # the bound on the Jeffreys
    return -np.inf
return .... # total log-prior to be determined

Насколько я понял в логарифмическом масштабе, я должен сложить вместе все вероятности, чтобы определить общую (возвращаемое значение lnprior). Итак, давайте начнем с нормального на a:

log_Pr(a) = np.log( 1.0 / (np.sqrt(2*np.pi)*sigma) ) - 0.5*(a - mu)**2/sigma**2;

затем до c:

log_Pr(c) = -log(c),

Таким образом, общий журнал должен составлять: Pr(a)+Pr(c), Мой вопрос, правильный ли этот подход?

Спасибо

0 ответов

Попробуйте следующее:

def lnprior(theta):
    a, b, c = theta
    #flat priors on b, c
    if not 1.0 < b < 2.0 and c > 0:
        return -np.inf
    #gaussian prior on a and c
    mu = 0.5
    sigma = 0.1
    ### your prior is gaussian * (1/c), take natural log is the following:
    return np.log(1.0/(np.sqrt(2*np.pi)*sigma))-0.5*(a-mu)**2/sigma**2 - np.log(c)

...--===Да!=== ---... [Еще двадцать три + символа, чтобы заполнить минимальную длину ответа]

Другие вопросы по тегам