使用未知数量的结构变化为Poisson RV建模

时间:2018-11-29 18:38:48

标签: tensorflow-probability probabilistic-programming

过去365天内,我有一些用户互动的计数数据。我有理由相信已经发生了一些事件,这些事件改变了用户交互的速度。模型如下:

假设

  • 每日计数数据(局部)是从泊松分布中提取的,参数为lambda
  • 0n<365之间有结构上的变化,即lambda上的变化
  • 这些变化可以在365天的任何时间发生

所需答案

  • 可能的结构变化发生了多少次?
  • 这些变化何时发生?

我想用tensorflow_probability实例化该模型。在this chapter末尾描述的模型似乎是一个很好的起点。但是,结构更改的数量被硬编码为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))
  )

1 个答案:

答案 0 :(得分:1)

您是完全正确的,在大多数现有工具(包括TFP)中,具有随机数的潜在变量的模型很难编写,因为它们要求推理计算的形状在推理过程中动态变化:要推理的事物集本身就是您要推断的数量之一。这不(轻松)适合标准的计算图框架。

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

一种相关的方法是将结构不确定性作为贝叶斯模型选择的问题来对待:代替对具有不确定结构的模型进行拟合,可以考虑几个具有不同数量变量的模型,并使用边际可能性进行比较。

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