Python:如何获得两个连续分布的卷积?

时间:2018-09-16 11:42:26

标签: python scipy probability

让X,Y为2个随机变量,其概率密度函数为pdf1和pdf2。

Z = X + Y

然后,Z的概率密度函数由pdf1和pdf2的卷积给出。由于我们无法处理连续分布,因此对连续分布进行描述并加以处理。

要找到均匀分布和正态分布的卷积,我想出了以下代码。

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from scipy import signal


uniform_dist = stats.uniform(loc=2, scale=3)
std = 0.25
normal_dist = stats.norm(loc=0, scale=std)

delta = 1e-4
big_grid = np.arange(-10,10,delta)

pdf1 = uniform_dist.pdf(big_grid)
print("Integral over uniform pdf: "+str(np.trapz(pdf1, big_grid)))

pdf2 = normal_dist.pdf(big_grid)
print("Integral over normal pdf: "+str(np.trapz(pdf2, big_grid)))


conv_pdf = signal.fftconvolve(pdf1,pdf2,'same')
print("Integral over convoluted pdf: "+str(np.trapz(conv_pdf, big_grid)))

plt.plot(big_grid,pdf1, label='Tophat')
plt.plot(big_grid,pdf2, label='Gaussian error')
plt.plot(big_grid,conv_pdf, label='Sum')
plt.legend(loc='best'), plt.suptitle('PDFs')
plt.show() 

这是我得到的输出。

在制服上积分pdf:0.9999999999976696

对普通pdf的积分:1.0

对复杂的pdf进行积分:10000.0

如果卷积正确,则“对卷积pdf积分”应该得到接近1的值。那么,这里出了什么问题?有解决这个问题的更好方法吗?

谢谢

3 个答案:

答案 0 :(得分:3)

在卷积之前,应将pdf简化为概率质量函数。

import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from scipy import signal


uniform_dist = stats.uniform(loc=2, scale=3)
std = 0.25
normal_dist = stats.norm(loc=0, scale=std)

delta = 1e-4
big_grid = np.arange(-10,10,delta)

pmf1 = uniform_dist.pdf(big_grid)*delta
print("Sum of uniform pmf: "+str(sum(pmf1)))

pmf2 = normal_dist.pdf(big_grid)*delta
print("Sum of normal pmf: "+str(sum(pmf2)))


conv_pmf = signal.fftconvolve(pmf1,pmf2,'same')
print("Sum of convoluted pmf: "+str(sum(conv_pmf)))

pdf1 = pmf1/delta
pdf2 = pmf2/delta
conv_pdf = conv_pmf/delta
print("Integration of convoluted pdf: " + str(np.trapz(conv_pdf, big_grid)))


plt.plot(big_grid,pdf1, label='Uniform')
plt.plot(big_grid,pdf2, label='Gaussian')
plt.plot(big_grid,conv_pdf, label='Sum')
plt.legend(loc='best'), plt.suptitle('PDFs')
plt.show()

答案 1 :(得分:0)

要使用离散化的pdf,您需要标准化fftconvolve的输出:

conv_pdf = signal.fftconvolve(pdf1, pdf2, 'same') * delta

enter image description here

请注意,fftconvolve本身不能做到,因为它不知道实际的pdf,而仅是值。

答案 2 :(得分:0)

除了离散化之外,对于scipy.stats连续分布,这似乎目前是不可能的,因为卷积会产生唯一的分布。如果一个密度函数是高斯函数,另一个密度函数是统一的,则它们的卷积就是一个“模糊高斯”函数。这既不是高斯也不是统一的。

但是,有一些有用的特殊情况。例如,如果要处理正态分布,则两个独立分布的卷积也是正态的。

您的问题中仅需强调一个细节-卷积公式仅适用于X和Y是独立的。