python - Python:如何获得两个连续分布的卷积?
问题描述
设 X、Y 为 2 个随机变量,概率密度函数为 pdf1 和 pdf2。
Z = X + Y
然后通过pdf1和pdf2的卷积给出Z的概率密度函数。由于我们无法处理连续分布,因此我们对连续分布进行描述并处理它们。
为了找到均匀分布和正态分布的卷积,我想出了以下代码。
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
如果卷积是正确的,我应该得到一个接近 1 的“积分超过卷积 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()
推荐阅读
- php - 在动态数量的按钮中点击了什么按钮
- bash - Terraform 无法在 bash Linux 中将列表作为变量传递
- c# - Web API 快速入门示例
- android - 如何修复 Android 中的“Volley 客户端 NetworkError”?
- reactjs - 有没有办法解决严重的政策?
- jmeter - JMeter 自定义插件变量替换
- typescript - 使用switchMap时使用'from'和'of'有什么区别?
- excel - Excel VBA - 将单元格值添加到数组
- java - 应为字符串,但在第 1 行第 123 列路径 $.options 处为 BEGIN_OBJECT。在easypost发货中
- php - 如何使用 strpos 将数据库中的常见垃圾邮件字段与表单提交相匹配?