Моделирование пуассоновского RV с неизвестным числом структурных изменений - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть некоторые данные для взаимодействия с пользователем за последние 365 дней.У меня есть основания полагать, что произошло несколько событий, которые изменяют частоту взаимодействия пользователей.Модель выглядит следующим образом:

Допущения

  • Данные суточного счета (локально) взяты из распределения Пуассона с параметром lambda
  • Есть между 0 и n<365 структурные изменения, т.е. lambda изменения
  • Эти изменения могут произойти в любое время в течение 365 дней

Желаемые ответы

  • Сколько раз происходили вероятные структурные изменения?
  • Когда произошли эти изменения?

Я хотел бы создать экземпляр этой модели с tensorflow_probability.Модель, описанная в конце этой главы , кажется хорошей отправной точкой.Однако количество структурных изменений жестко задано равным 1. Как расширить эту модель для обработки неизвестного количества изменений?

РЕДАКТИРОВАТЬ

Это модифицированная версия кода, упомянутого выше,Это позволяет произвольное количество точек переключения.Вдохновленный ответом Дейва Мура ниже, я позволил tau иметь элементы «вне границ» путем умножения на 2. Стилистически я обеспокоен вычислением для indices, так как я думаю, что это немного сбивает с толкучтобы понять, что происходит.Однако я не могу придумать лучшего способа сделать это.С функциональной точки зрения меня беспокоит влияние, которое за пределами допустимых значений может повлиять на логарифмическую вероятность.

def joint_log_prob(count_data, taus, lambdas, max_switches):
  rate = np.array(1./count_data_.mean(), np.float32)
  lambdas_prior = tfd.Exponential(rate)
  taus_prior = tfd.Uniform()

  A = tf.gather(
        taus * ndays,
        indices=tf.stack([tf.fill([ndays], i) for i in range(max_switches-1)])
  )
  B = tf.to_float(tf.range(ndays))
  indices = tf.reduce_sum(tf.to_int32(tf.less(A, B)), axis=0)
  lambda_ = tf.gather(lambdas, indices)
  count_data_prior = tfd.Poisson(lambda_)

  return (
      tf.reduce_sum(count_data_prior.log_prob(count_data))
    + tf.reduce_sum(taus_prior.log_prob(taus))
    + tf.reduce_sum(lambdas_prior.log_prob(lambdas))
  )

1 Ответ

0 голосов
/ 01 декабря 2018

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

Обычное решение - переписать модель, чтобы использовать фиксированное число переменных.Например, если вы думаете, что будет не более 20 структурных изменений, вы можете написать модель с 20 точками изменения, где некоторые могут быть «фиктивными» точками изменения (например, происходящими за пределами длины наблюдаемого сигнала), так что толькоподмножество действительно активно.

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

К сожалению, я не знаю каких-либо конкретных примеров применения этих подходов специально к моделям точек изменения - может быть, у других будут лучшие ссылки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...