Байесовское обновление в pymc3: добавление дополнительных данных не работает - PullRequest
0 голосов
/ 16 апреля 2020

Я новичок в pymc3, но я слышал, что его можно использовать для построения байесовской модели обновления. Поэтому я попытался, но безуспешно. Моя цель состояла в том, чтобы предсказать, в какой день недели человек покупает определенный товар, на основе предварительной информации от ряда клиентов, а также истории покупок этого человека.

Итак, давайте предположим, что я знаю, что клиенты в целом покупать этот продукт только по понедельникам, вторникам, средам и четвергам; и что число клиентов, которые купили продукт в прошлом в те дни, составляет 3,2, 1 и 1 соответственно. Я думал, что настрою свою модель так:

import pymc3 as pm

dow = ['m', 'tu', 'w','th']
c = np.array([3, 2, 1, 1])

# hyperparameters (initially all equal)
alphas = np.array([1, 1, 1, 1])
with pm.Model() as model:
    # Parameters of the Multinomial are from a Dirichlet
    parameters = pm.Dirichlet('parameters', a=alphas, shape=4)
    # Observed data is from a Multinomial distribution
    observed_data = pm.Multinomial(
        'observed_data', n=7, p=parameters, shape=4, observed=c)

Так что это настроило мою модель без проблем. Затем у меня есть данные об отдельных клиентах за 4 недели: 1 означает, что они купили продукт, 0 означает, что они этого не сделали, для данного дня недели. Я думал, что обновить модель будет так просто:

c = np.array([[1, 0,0,0],[0,1,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,1])

with pm.Model() as model:
    # Parameters are a dirichlet distribution 
    parameters = pm.Dirichlet('parameters', a=alphas, shape=4)
    # Observed data is a multinomial distribution
    observed_data = pm.Multinomial(
        'observed_data',n=1,p=parameters,  shape=4, observed=c)    

    trace = pm.sample(draws=100, chains=2, tune=50, discard_tuned_samples=True)

Это не сработало.

Мои вопросы:

  • Принимает ли это Учет учетных записей, которые я установил ранее, или это создает совершенно новую модель?
  • Как написано выше, код не работал, поскольку он выдал мне ошибку «плохая начальная энергия». Методом проб и ошибок я обнаружил, что параметр «n» должен быть суммой элементов в наблюдениях (поэтому у меня не может быть наблюдений, складывающихся в разные n). Это почему? Конечно, ситуация, которую я описал выше (где одни недели делают покупки только по понедельникам, а другие по понедельникам и четвергам), не является невозможной?

Есть ли лучший способ использования pymc3 или другого пакета для решения проблемы такого типа? Спасибо!

1 Ответ

1 голос
/ 16 апреля 2020

Чтобы ответить на ваши конкретные c вопросы сначала:

  • Вторая модель - новая модель. Вы можете повторно использовать менеджеры контекста, изменив строку на with model:, но, глядя на код, вероятно, это не то, что вы намеревались сделать.
  • Полиномиальное распределение занимает n dr aws, используя предоставленные вероятности, и возвращает один список. pymc3 будет транслироваться для вас, если вы предоставите массив для n. Вот приведенная в порядок версия вашей модели:
with pm.Model() as model:
    parameters = pm.Dirichlet('parameters', a=alphas)
    observed_data = pm.Multinomial(
        'observed_data', n=c.sum(axis=-1), p=parameters, observed=c)    

    trace = pm.sample()

Вы также спрашиваете, является ли pymc3 подходящей библиотекой для этого вопроса, и это здорово! Две модели, которые вы записали, хорошо известны, и вы можете решить заднюю часть вручную, что на намного быстрее: в первой модели это Dirichlet([4, 3, 2, 2]), а во второй Dirichlet([5, 2, 1, 2]). Вы можете подтвердить это с помощью PyMC3 или , читайте здесь .

Если вы хотели расширить свою модель или выбрали дистрибутивы, которые не были сопряженными, то PyMC3 может быть лучшим выбором.

...