Понимание кода с декораторами в pymc, Python

Я пытался получить некоторую информацию об иерархических моделях и нашел этот замечательный пост: https://sl8r000.github.io/ab_testing_statistics/use_a_hierarchical_model/

В нем, закройте середину поста, автор делится каким-то кодом. Есть часть, с которой у меня проблемы:

@pymc.stochastic(dtype=np.float64)
def hyperpriors(value=[1.0, 1.0]):
  a, b = value[0], value[1]
  if a <= 0 or b <= 0:
    return -np.inf
  else:
    return np.log(np.power((a + b), -2.5))

a = hyperpriors[0]
b = hyperpriors[1]

Как видите, автор использует pymc. Теперь меня смущает синтаксис здесь. Я получаю определение декоратора, но не определение a и b с квадратными скобками. Есть ли у кого-то опыт в этой области и не против поделиться тем, что происходит под капотом?


person Damien    schedule 23.08.2015    source источник


Ответы (1)


В проекте pymc декораторы используются не для возврата новой функции, а для возврата Stochastic() экземпляр класса.

Из документации:

Равномерно распределенная дискретная стохастическая переменная switchpoint в (disaster_model) также может быть создана из функции, которая вычисляет ее логарифмическую вероятность следующим образом:

@pymc.stochastic(dtype=int)
def switchpoint(value=1900, t_l=1851, t_h=1962):
    """The switchpoint for the rate of disaster occurrence."""
    if value > t_h or value < t_l:
        # Invalid values
        return -np.inf
    else:
        # Uniform log-likelihood
        return -np.log(t_h - t_l + 1)

Обратите внимание, что это простая функция Python, которой предшествует выражение Python, называемое decorator [vanRossum2010], здесь оно называется @stochastic. Как правило, декораторы расширяют функции дополнительными свойствами или функциональностью. Объект Stochastic, созданный декоратором @stochastic, будет оценивать свою логарифмическую вероятность с помощью функции switchpoint. Аргумент value, который является обязательным, предоставляет начальное значение для переменной. Остальные аргументы будут назначены родительскими для switchpoint (т. е. они будут заполнять словарь родителей).

Итак, hyperpriors — это экземпляр класса Stochastic, и именно этот объект поддерживает индексирование. Таким образом, вы можете использовать hyperpriors[0] и hyperpriors[1] для этого объекта. hyperpriors больше не функция.

person Martijn Pieters    schedule 23.08.2015
comment
Итак, стохастический класс имеет свойство возвращать обновленные переменные, переданные в значение. Итак, в моем случае: a = гиперприор[0] и b = гиперприор[1]. В вашем случае у меня будет year = switchpoint[0]. Модель подгоняет переменные в зависимости от заданных дистрибутивов и в моем случае гиперприорий. Затем к переменным, хранящимся внутри (внутри стохастического класса), обращаются как к индексам гиперприора экземпляра и присваивают им значения a и b. Я думаю, что это имеет больше смысла сейчас. Спасибо! - person Damien; 24.08.2015