Вычисленная логарифмическая вероятность PyMC @observed не может быть приведена к ошибке с плавающей запятой

У меня возникли небольшие проблемы с переключением пользовательской переменной @stochasitc на переменную @observed в PyMC. У меня есть стохастическая переменная, настроенная следующим образом:

def age_logp(age):
    if age < 0 or age > 110:
        return -np.inf
    elif 0 <= age < 20:
        prob = age_dist['0-20']
    elif 20 <= age < 40:
        prob = age_dist['20-40']
    elif 40 <= age < 60:
        prob = age_dist['40-60']
    elif 60 <= age < 80:
        prob = age_dist['60-80']
    elif age >= 80:
        prob = age_dist['80-inf']
    return np.log(prob)


@pymc.stochastic
def age(value=0):
    def logp(value):
        return age_logp(value)

Как мне переключить это на наблюдаемую переменную? Я пробовал это до сих пор:

@pymc.observed
def age(value=np.array([12, 43, 28, 39, 87, 26])):
    return map(age_logp, value)

Но я получаю TypeError: age: computed log-probability [-1.639897119918809, -1.3394107752210402, -1.0876723486297752, -1.0876723486297752, -3.1235656450638758, -1.0876723486297752] cannot be cast to float

Как расширить age, чтобы получить массив наблюдаемых значений?


person calstad    schedule 09.01.2015    source источник


Ответы (1)


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

@pymc.observed
def age(value=np.array([12, 43, 28, 39, 87, 26])):
    return sum(map(age_logp, value))

Вы можете комбинировать их каким-либо другим способом, если хотите. Суть в том, что age должно возвращать скалярное значение.

person Abraham D Flaxman    schedule 12.01.2015
comment
Я не понимаю... Почему вы можете добавить их? - person Delosari; 19.02.2016