随机变量之和的概率分布:卷积定理的简单应用

我们在《一个最大化条件概率问题》一文中提到,为了满足商品采购业务的需要,我们首先预测每一天的需求所服从的概率分布,然后计算若干天总需求所服从的概率分布。那么,如何将日需求的分布转化为总需求的分布呢?

方法

考虑一组独立的随机变量 X1,X2,,XnX_1, X_2, \cdots, X_n,令

Sn=i=1nXiS_n=\sum_{i=1}^{n} X_i

Sn=Sn1+XnS_n = S_{n-1} + X_n

也就是说,多个随机变量的和总可以还原回两个随机变量的和的情况。因此,我们只需要知道如何计算两个随机变量的和的分布就可以了。

假设 XXYY 是两个独立的随机变量,令 Z=X+YZ=X+Y

  • XXYY 是离散型随机变量,则 ZZ 的概率质量函数为 XX 的概率质量函数与 YY 的概率质量函数的离散卷积:

P(Z=z)=k=+P(X=k)P(Y=zk)P(Z=z) = \sum_{k=-\infty}^{+\infty}P(X=k)\cdot P(Y=z-k)

  • XXYY 是连续型随机变量,则 ZZ 的概率密度函数为 XX 的概率密度函数与 YY 的概率密度函数的卷积:

fZ(z)=+fX(x)fY(zx)dxfXfYf_Z(z) = \int_{-\infty}^{+\infty}f_X(x)f_Y(z-x)\mathrm dx\equiv f_X*f_Y

卷积怎么算呢?根据定义直接算,可以,但没必要。复习一下卷积定理:

函数卷积的傅里叶变换是函数傅里叶变换的乘积。

对于离散型随机变量,我们只需要用 FFT 算法计算 XXYY 的概率质量函数的离散傅里叶变换,然后作乘积,再作一次逆变换,即可求得 ZZ 的概率质量函数。对于连续型随机变量,则可以先离散化,然后用上述方法近似求解 ZZ 的概率密度函数。

作为调包工程师,我们直接调用 scipy.signal.fftconvolve 实现来上述操作。

例子

我们来验证一下。

假设 XN(30,102)X\sim N(30, 10^2)YN(60,52)Y\sim N(60, 5^2),则 ZN(90,102+52)Z\sim N(90, 10^2+5^2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
from scipy.signal import fftconvolve

x = norm.pdf(np.arange(100), loc=30, scale=10)
y = norm.pdf(np.arange(100), loc=60, scale=5)
z = norm.pdf(np.arange(200), loc=90, scale=np.sqrt(125))
z_tilde = fftconvolve(x, y)

plt.subplot(121)
plt.plot(x, color='b', label='pdf of X')
plt.plot(y, color='g', label='pdf of Y')
plt.legend()
plt.subplot(122)
plt.plot(z, color='r', label='analytical pdf of Z')
plt.plot(z_tilde, color='y', label='numerical pdf of Z')
plt.legend()
plt.show()

再看一个例子。

考虑一组独立的随机变量 X1,X2,,X100X_1, X_2, \cdots, X_{100},满足 XiBernoulli(0.3)X_i\sim Bernoulli(0.3),即每个 XiX_i 均服从成功概率 p=0.3p=0.3 的伯努利分布。令 Z=X1+X2++X100Z=X_1+X_2+\cdots+X_{100},即 ZZ 是 100 次独立重复试验中成功的次数。根据定义,ZZ 服从二项分布。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import binom
from scipy.signal import fftconvolve
from functools import reduce

xs = [[0.7, 0.3] for _ in range(100)]
z = binom.pmf(np.arange(100), n=100, p=0.3)
z_tilde = reduce(fftconvolve, xs)

plt.plot(z, label='analytical pmf of Z')
plt.plot(z_tilde, label='numerical pmf of Z')
plt.legend()
plt.show()

最后看看实际计算总需求时的效果:

附录

附上卷积定理的简单推导:

考虑函数 f(t)f(t)g(t)g(t),以及它们的卷积 h=fgh=f*gf(t)f(t)g(t)g(t) 的傅里叶变换分别为

f^(ω)=+f(t)eiωtdt\hat f(\omega) = \int_{-\infty}^{+\infty}f(t)\mathrm e^{-i\omega t}\mathrm dt

g^(ω)=+g(t)eiωtdt\hat g(\omega) = \int_{-\infty}^{+\infty}g(t)\mathrm e^{-i\omega t}\mathrm dt

h(t)h(t) 的傅里叶变换为

h^(ω)=+h(t)eiωtdt=+[+f(τ)g(tτ)dτ]eiωtdt=++f(τ)g(tτ)eiωtdtdτ\begin{aligned} \hat h(\omega) &= \int_{-\infty}^{+\infty}h(t)\mathrm e^{-i\omega t}\mathrm dt\\ &= \int_{-\infty}^{+\infty}\left[\int_{-\infty}^{+\infty}f(\tau)g(t-\tau)\mathrm d\tau\right]\mathrm e^{-i\omega t}\mathrm dt\\ &= \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}f(\tau)g(t-\tau)e^{-i\omega t}\mathrm dt\mathrm d\tau \end{aligned}

s=tτs=t-\tau,则 ds=dt\mathrm ds = \mathrm dt

h^(ω)=++f(τ)g(s)eiω(τ+s)dsdτ=+f(τ)eiωτdτ+g(s)eiωsds=f^(ω)g^(ω)\begin{aligned} \hat h(\omega) & = \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}f(\tau)g(s)e^{-i\omega (\tau+s)}\mathrm ds\mathrm d\tau\\ &= \int_{-\infty}^{+\infty}f(\tau)e^{-i\omega \tau}\mathrm d\tau\int_{-\infty}^{+\infty}g(s)e^{-i\omega s}\mathrm ds\\ &=\hat f(\omega)\cdot\hat g(\omega) \end{aligned}

参考文献