本文链接:个人站 | 简书 | CSDN
版权声明:除特别声明外,本博客文章均采用 BY-NC-SA 许可协议。转载请注明出处。
我们在《一个最大化条件概率问题》一文中提到,为了满足商品采购业务的需要,我们首先预测每一天的需求所服从的概率分布,然后计算若干天总需求所服从的概率分布。那么,如何将日需求的分布转化为总需求的分布呢?
方法
考虑一组独立的随机变量 ,令
则
也就是说,多个随机变量的和总可以还原回两个随机变量的和的情况。因此,我们只需要知道如何计算两个随机变量的和的分布就可以了。
假设 和 是两个独立的随机变量,令 。
-
若 和 是离散型随机变量,则 的概率质量函数为 的概率质量函数与 的概率质量函数的离散卷积:
-
若 和 是连续型随机变量,则 的概率密度函数为 的概率密度函数与 的概率密度函数的卷积:
卷积怎么算呢?根据定义直接算,可以,但没必要。复习一下卷积定理:
函数卷积的傅里叶变换是函数傅里叶变换的乘积。
对于离散型随机变量,我们只需要用 FFT 算法计算 和 的概率质量函数的离散傅里叶变换,然后作乘积,再作一次逆变换,即可求得 的概率质量函数。对于连续型随机变量,则可以先离散化,然后用上述方法近似求解 的概率密度函数。
作为调包工程师,我们直接调用 scipy.signal.fftconvolve
实现来上述操作。
例子
我们来验证一下。
假设 ,,则 。
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()
正态分布之和
再看一个例子。
考虑一组独立的随机变量 ,满足 ,即每个 均服从成功概率 的伯努利分布。令 ,即 是 100 次独立重复试验中成功的次数。根据定义, 服从二项分布。
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()
伯努利分布之和
最后看看实际计算总需求时的效果:
从日需求到总需求
附录
附上卷积定理的简单推导:
考虑函数 和 ,以及它们的卷积 。 和 的傅里叶变换分别为
而 的傅里叶变换为
令 ,则 ,
网友评论