2011-06-29 95 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