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

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

作者: 虚胖一场 | 来源:发表于2020-04-21 16:48 被阅读0次

    本文链接个人站 | 简书 | CSDN
    版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载请注明出处。

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

    方法

    考虑一组独立的随机变量 X_1, X_2, \cdots, X_n,令
    S_n=\sum_{i=1}^{n} X_i

    S_n = S_{n-1} + X_n
    也就是说,多个随机变量的和总可以还原回两个随机变量的和的情况。因此,我们只需要知道如何计算两个随机变量的和的分布就可以了。

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

    • XY 是离散型随机变量,则 Z 的概率质量函数为 X 的概率质量函数与 Y 的概率质量函数的离散卷积:
      P(Z=z) = \sum_{k=-\infty}^{+\infty}P(X=k)\cdot P(Y=z-k)

    • XY 是连续型随机变量,则 Z 的概率密度函数为 X 的概率密度函数与 Y 的概率密度函数的卷积:
      f_Z(z) = \int_{-\infty}^{+\infty}f_X(x)f_Y(z-x)\mathrm dx\equiv f_X*f_Y

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

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

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

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

    例子

    我们来验证一下。

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

    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()
    
    正态分布之和

    再看一个例子。

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

    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)g(t),以及它们的卷积 h=f*gf(t)g(t) 的傅里叶变换分别为
    \hat f(\omega) = \int_{-\infty}^{+\infty}f(t)\mathrm e^{-i\omega t}\mathrm dt
    \hat g(\omega) = \int_{-\infty}^{+\infty}g(t)\mathrm e^{-i\omega t}\mathrm dt
    h(t) 的傅里叶变换为
    \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-\tau,则 \mathrm ds = \mathrm dt
    \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}

    参考文献

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ojhpihtx.html