确定事件尚未发生时发生的可能性

时间:2010-05-03 18:26:11

标签: algorithm statistics probability

用户在 t 时访问我的网站,他们可能会或可能不会点击我关注的特定链接,如果他们这样做我会记录他们点击链接的事实,以及他们点击 t 后的持续时间,请将其称为 d

我需要一个允许我创建这样的类的算法:

class ClickProbabilityEstimate {
    public void reportImpression(long id);
    public void reportClick(long id);

    public double estimateClickProbability(long id);
}

每次展示都会获得一个唯一的 ID ,并在报告点击以指示点击所属的展示时使用。

我需要一种算法,该算法会根据报告展示次数所经过的时间返回一个概率,即根据之前点击所需的时间长短,展示会获得点击次数。很明显,如果仍然没有点击,那么这个概率会随着时间的推移而减少。

如果有必要,我们可以设置一个上限,超出该上限我们认为点击概率为0(例如,如果它是印象发生后的一个小时,我们可以肯定不会有点击)

该算法应该既节省空间又节省时间,并且希望尽可能少地做出假设,同时保持优雅。易于实施也很好。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

假设您保留过去展示次数和点击次数的数据,这很简单:假设您有一次展示,并且自那次展示以来已经过了 d'时间。您可以将数据分为三组:

  1. 点击次数少于 d'
  2. 的展示次数
  3. 超过 d'
  4. 后收到点击的展示次数
  5. 从未收到过点击的展示次数
  6. 显然,目前的印象不在组(1)中,所以消除它。你想要它在group(2)中的概率,那就是

    P = N2 / (N2 + N3)
    

    其中N2是第2组中的展示次数,N3也是如此。

    就实际实施而言,我首先考虑的是保留有效时间 d 的有序列表,以及过去的点击次数,以及从未收到的展示次数计数点击,然后在该列表中对 d'进行二进制搜索。您找到的位置将为您N1,然后N2是列表的长度减去N1

    如果您不需要完美的粒度,则可以将过去时间存储为直方图,即在每个元素list[n]中包含至少{@}后获得点击的展示次数的列表{1}}但不到n分钟。 (或几秒钟,或您喜欢的任何时间间隔)在这种情况下,您可能希望将总点击次数保持为单独的变量,以便您可以轻松计算n+1

    (顺便说一下,我刚刚做了这个,我不知道是否有这种事情的标准算法可能更好)

答案 1 :(得分:1)

答案 2 :(得分:0)

我建议假设一个到达过程(每分钟点击次数),并尝试使用现有数据将分布拟合到该到达过程。我敢打赌,结果是负二项式,这是当你有一个具有非平稳均值的泊松到达过程时得到的,如果均值具有伽马分布。反向(每次点击的分钟数)为您提供了到达间隔过程的分布。不知道是否有以此命名的分布,但您可以创建一个经验分布。

希望这会有所帮助。