У меня есть некоторые данные для взаимодействия с пользователем за последние 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))
)