0

我有一些过去 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))
  )
4

1 回答 1

1

您说得对,在大多数现有工具(包括 TFP)中编写具有随机数量潜在变量的模型很棘手,因为它们需要推理计算的形状在推理过程中动态变化:要推理的一组事物本身就是一个您正在推断的数量。这不(很容易)适合标准的计算图框架。

通常的解决方案是重写模型以使用固定数量的变量。例如,如果您认为最多会有 20 个结构变化,您可以编写一个具有 20 个变化点的模型,其中一些被允许是“虚拟”变化点(例如,发生在观察信号长度之外),因此只有一个子集实际上是活跃的。

一种相关的方法是将结构不确定性视为贝叶斯模型选择的问题:不是拟合具有不确定结构的模型,而是考虑多个模型,每个模型具有不同数量的变量,并使用边际似然比较它们。

不幸的是,我不知道将这些方法专门应用于变更点模型的任何具体示例——也许其他人会有更好的参考?

于 2018-12-01T05:19:49.310 回答