Как установить ключ для детерминированной переменной в pymc

Я пытаюсь построить разницу между двумя переменными. Я следую приведенному здесь примеру (найдите true_p_A, и он будет в правом разделе)

Вот мой код

def cool(test):

    n_data_points = len(test)
    alpha = 1.0/np.mean(test)
    lambda_1 = pm.Exponential("lambda_1", alpha)  # prior on first behaviour
    lambda_2 = pm.Exponential("lambda_2", alpha)  # prior on second behaviour
    tau = pm.DiscreteUniform("tau", lower=0, upper=len(test))  # prior on behaviour change

    """
    The below deterministic functions map an assignment, in this case 0 or 1,
    to a set of parameters, located in the (1,2) arrays `taus` and `centers`.
    """

    @pm.deterministic
    def lambda_(tau=tau, lambda_1=lambda_1, lambda_2=lambda_2):
        out = np.zeros(n_data_points)
        out[:tau] = lambda_1  # lambda before tau is lambda1
        out[tau:] = lambda_2  # lambda after tau is lambda2
        return out

    def delta(p_A=lambda_1, p_B=lambda_2):
            return p_A - p_B
    obs = pm.Poisson("obs", lambda_, value=test, observed=True)

    model = pm.Model([obs, lambda_, lambda_1, lambda_2, tau,delta])

    mcmc = pm.MCMC(model)
    mcmc.sample(5000, 1000, 1)

    return mcmc,5000,1

def main_plotter(stats,test):
    mcmc,N,bin = stats

    n_count_data = len(test)

    lambda_1_samples = mcmc.trace('lambda_1')[:]
    lambda_2_samples = mcmc.trace('lambda_2')[:]
    tau_samples = mcmc.trace('tau')[:]
    delta_samples = mcmc.trace('delta')
    print(delta_samples)

data = [1,2,1,2.2,5,5.5,6,5.4]
main_plotter( cool(data),data)

В этом примере переменная для дельты не создается, поэтому значение ключа не вставляется. Всякий раз, когда я запускаю этот код, он говорит мне, что не может найти ключ. Мой вопрос: что мне нужно сделать, чтобы получить доступ к последним данным дельты?

1 ответ

Решение

Вы скучаете по deterministic декоратор перед delta определение функции. Это работает, если вы измените, начиная со строки 21:

@pm.deterministic
def delta(p_A=lambda_1, p_B=lambda_2):
        return p_A - p_B
Другие вопросы по тегам