2011-06-29 61 views
2

两个随机变量x和y之和的概率分布由各个分布的卷积给出。我在数值上做这件事有些麻烦。在下面的例子中,x和y是均匀分布的,它们各自的分布近似为直方图。我的推理说直方图应该被卷积以给出x + y的分布。查找两个直方图的卷积

from numpy.random import uniform 
from numpy import ceil,convolve,histogram,sqrt 
from pylab import hist,plot,show 

n = 10**2 

x,y = uniform(-0.5,0.5,n),uniform(-0.5,0.5,n) 

bins = ceil(sqrt(n)) 

pdf_x = histogram(x,bins=bins,normed=True) 
pdf_y = histogram(y,bins=bins,normed=True) 

s = convolve(pdf_x[0],pdf_y[0]) 

plot(s) 
show() 

其给出以下,

enter image description here

换句话说,三角分布,如所预期。但是,我不知道如何找到x值。如果有人能在这里纠正我,我将不胜感激。

+0

如果你甚至没有在图表中指定它们,那么'x'值如何正确?另外,严格来说,'直方图'不会给你一个'pdf'这么简单的方法。但是,请首先考虑''n'的'箱'数量。谢谢 – eat

+0

@eat:正确。查看修改。 – lafras

回答

5

为了仍然继续前进(朝着更明朗的细节),我还适合于你的代码是这样的:

from numpy.random import uniform 
from numpy import convolve, cumsum, histogram, linspace 

s, e, n= -0.5, 0.5, 1e3 
x, y, bins= uniform(s, e, n), uniform(s, e, n), linspace(s, e, n** .75) 
pdf_x= histogram(x, normed= True, bins= bins)[0] 
pdf_y= histogram(y, normed= True, bins= bins)[0] 
c= convolve(pdf_x, pdf_y); c= c/ c.sum() 
bins= linspace(2* s, 2* e, len(c)) 
# a simulation 
xpy= uniform(s, e, 10* n)+ uniform(s, e, 10* n) 
c2= histogram(xpy, normed= True, bins= bins)[0]; c2= c2/ c2.sum() 

from pylab import grid, plot, show, subplot 
subplot(211), plot(bins, c) 
plot(linspace(xpy.min(), xpy.max(), len(c2)), c2, 'r'), grid(True) 
subplot(212), plot(bins, cumsum(c)), grid(True), show() 

因此,赋予曲线是这样的: enter image description here 其中上部分代表PDF (蓝线),其确实看起来相当三角形和模拟(红点),它反映了三角形状。下半部分代表CDF,它也看起来很好地遵循预期的S -curve。

+0

感谢您的回答。根据维基百科关于[convolution]的文章(http://en.wikipedia.org/wiki/Convolution),我预计新的x范围将从-1运行到1.这就是我正在努力的部分。 – lafras

+0

这(pdf_x =直方图(x)** [0] **)在卷积之前忽略了直方图的bin“位置”,将直方图转换为pdf。因此,对于真实数据,确保在执行此操作之前,您的两个数据集直方图“对齐”为具有完全相同的bin(使用“bins = bins”参数)。您可以用零计数(空箱)填充任何不重叠的间隙或边距。否则,即使它们看起来像S曲线和三角形,所生成的PDF(和CDF)也是错误的。 – hobs