Python: 如何得到两个连续分布的卷积?
Python: How to get the convolution of two continuous distributions?
设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
如果卷积正确,"Integral over convoluted pdf" 的值应该接近 1。那么这里出了什么问题?有没有更好的方法来解决这个问题?
谢谢
要使用离散化的 pdf,您需要规范化 fftconvolve
:
的输出
conv_pdf = signal.fftconvolve(pdf1, pdf2, 'same') * delta
请注意 fftconvolve
不能自己完成,因为它不知道实际的 pdf,只知道值。
你应该在卷积之前将你的 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()
除了离散化之外,目前 scipy.stats 连续分布似乎无法做到这一点,因为卷积会产生独特的分布。如果一个密度函数是高斯的,另一个是均匀的,那么它们的卷积就是一个'blurred gaussian'。这既不是高斯分布也不是均匀分布。
但是,有一些有用的特殊情况。例如,如果您正在处理正态分布,则两个独立分布的卷积也将是正态的。
只有一个细节没有在您的问题中强调 - 卷积公式仅在 X 和 Y 独立时成立。
设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
如果卷积正确,"Integral over convoluted pdf" 的值应该接近 1。那么这里出了什么问题?有没有更好的方法来解决这个问题?
谢谢
要使用离散化的 pdf,您需要规范化 fftconvolve
:
conv_pdf = signal.fftconvolve(pdf1, pdf2, 'same') * delta
请注意 fftconvolve
不能自己完成,因为它不知道实际的 pdf,只知道值。
你应该在卷积之前将你的 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()
除了离散化之外,目前 scipy.stats 连续分布似乎无法做到这一点,因为卷积会产生独特的分布。如果一个密度函数是高斯的,另一个是均匀的,那么它们的卷积就是一个'blurred gaussian'。这既不是高斯分布也不是均匀分布。
但是,有一些有用的特殊情况。例如,如果您正在处理正态分布,则两个独立分布的卷积也将是正态的。
只有一个细节没有在您的问题中强调 - 卷积公式仅在 X 和 Y 独立时成立。