我有一些过去 365 天的用户交互计数数据。我有理由相信已经发生了一些改变用户交互速度的事件。模型如下:
假设
- 每日计数数据(本地)从带有参数的泊松分布中提取
lambda
- 之间有
0
结构n<365
变化,即lambda
变化 - 这些变化可以在 365 天期间的任何时间发生
期望的答案
- 可能的结构变化发生了多少次?
- 这些变化是什么时候发生的?
我想用tensorflow_probability
. 本章结尾处描述的模型似乎是一个很好的起点。但是,结构更改的数量被硬编码为 1。如何扩展此模型以处理未知数量的更改?
编辑
这是上述代码的修改版本。它允许任意数量的开关点。受到 Dave Moore 在下面的回答的启发,我允许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))
)