负二项分布

如题所述

第1个回答  2022-08-02
之前在介绍 DeepAR 等时间序列预测模型时,为了简单起见,我们使用了大家比较熟悉的正态分布作为示例。在实际应用中,需要根据数据本身的特点选择合适的分布。泊松分布、二项分布、以及负二项分布都可以用来刻画计数类数据。其中,泊松分布的 ,二项分布的 ,负二项分布的 。在我日常接触的业务场景中, 较为常见,为此免不了要跟负二项分布打交道。

虽然没什么必要,但是本着「有困难要上,没困难创造困难也要上」的精神,我们还是来推导一下负二项分布的相关公式。

需要注意的是,负二项分布的定义并不唯一。例如 tensorflow_probability 使用的定义与本文一致,而 scipy 则将 定义为伯努利试验成功 次时的失败次数。使用前一定要先看清楚, 别问我怎么知道的 。此外,Wikipedia 词条不同段落使用的定义竟然也不完全一致,或许是由不同的人编辑的。

时总共进行了 次试验,最后一次为失败,故前 次试验总共成功了 次,失败了 次。因此

根据定义

令 、 ,显然



首先计算

令 、 ,考虑服从负二项分布的随机变量 ,其概率质量函数为 ,显然



而根据定义

我们在文章开头提到,负二项分布的 。由于 ,这个结论是显而易见的。

负二项分布的累积分布函数可以表示为正则不完全 Beta 函数:

证明如下:

令 ,有

对 求偏导,得

而根据正则不完全 Beta 函数的定义,有

同样对 求偏导,得

也就是说

亦即

注意到 时有

解得常数 。

证毕。

DeepAR 等模型中,网络的输出目标是概率分布的参数。例如正态分布的 和 。但对于负二项分布而言,让网络直接输出 和 是不合适的,因为在训练过程中很难保证输出的值满足 。那么让网络输出 和 呢?似乎是可以的,只要保证 , 即可。前者可以使用 softplus 激活函数,后者可以使用 sigmoid 激活函数。有没有办法避免使用 sigmoid 呢?通常的做法是让网络输出 和 ,只要使用 softplus 激活函数确保二者均为正数即可。
相似回答