第1个回答 2022-08-02
之前在介绍 DeepAR 等时间序列预测模型时,为了简单起见,我们使用了大家比较熟悉的正态分布作为示例。在实际应用中,需要根据数据本身的特点选择合适的分布。泊松分布、二项分布、以及负二项分布都可以用来刻画计数类数据。其中,泊松分布的 ,二项分布的 ,负二项分布的 。在我日常接触的业务场景中, 较为常见,为此免不了要跟负二项分布打交道。
虽然没什么必要,但是本着「有困难要上,没困难创造困难也要上」的精神,我们还是来推导一下负二项分布的相关公式。
需要注意的是,负二项分布的定义并不唯一。例如 tensorflow_probability 使用的定义与本文一致,而 scipy 则将 定义为伯努利试验成功 次时的失败次数。使用前一定要先看清楚, 别问我怎么知道的 。此外,Wikipedia 词条不同段落使用的定义竟然也不完全一致,或许是由不同的人编辑的。
时总共进行了 次试验,最后一次为失败,故前 次试验总共成功了 次,失败了 次。因此
根据定义
令 、 ,显然
故
首先计算
令 、 ,考虑服从负二项分布的随机变量 ,其概率质量函数为 ,显然
故
而根据定义
我们在文章开头提到,负二项分布的 。由于 ,这个结论是显而易见的。
负二项分布的累积分布函数可以表示为正则不完全 Beta 函数:
证明如下:
令 ,有
对 求偏导,得
而根据正则不完全 Beta 函数的定义,有
同样对 求偏导,得
也就是说
亦即
注意到 时有
解得常数 。
证毕。
DeepAR 等模型中,网络的输出目标是概率分布的参数。例如正态分布的 和 。但对于负二项分布而言,让网络直接输出 和 是不合适的,因为在训练过程中很难保证输出的值满足 。那么让网络输出 和 呢?似乎是可以的,只要保证 , 即可。前者可以使用 softplus 激活函数,后者可以使用 sigmoid 激活函数。有没有办法避免使用 sigmoid 呢?通常的做法是让网络输出 和 ,只要使用 softplus 激活函数确保二者均为正数即可。