2013-03-22 106 views
3

我正在尋找生成二項式的分佈。我想要一個二項式分佈,但我希望它以零爲中心(我知道這對於二項分佈的定義沒什麼意義,但仍然是,這是我的目標。)在零附近生成二項分佈

我發現的唯一方法是在Python中這樣做是:

def zeroed_binomial(n,p,size=None): 
    return numpy.random.binomial(n,p,size) - n*p 

是否有這個分佈的真名?這段代碼是否真的給了我想要的東西(以及我怎麼說)?是否有更清潔/更好/經典/已經實現的方式?

+0

我只能看到感覺在這樣的分配,如果P = 0.5(否則爲中心的概念似乎牽強) – njzk2 2013-03-22 14:28:21

+0

或許中心是打錯字了,我的意思是,最常見的元素應該爲零。 – jhoyla 2013-03-22 14:29:56

+0

所以基本上是一個二項式,如f(0)= max(f(x))。你在做什麼? – njzk2 2013-03-22 14:32:03

回答

2

如果你想要一個以「0」爲中心的「離散化」正態分佈,你正在做的事情很好。如果你想要整數值,你應該在減去前舍入n*p

limit of the binomial distribution is just the normal distributionn變大,與p界從0或1,因爲n*p遠不會是除了某些值的整數,爲什麼不直接使用正態分佈?

+1

這對大N來說都是如此,但是操作可能需要一個小N的二項式,在這種情況下,正態分佈不會是一個好的近似值。 – 2013-03-22 16:19:34

+0

對'n * p'四捨五入的好的呼叫。 – jhoyla 2013-03-22 17:28:43

+0

@AndrewMao你可以詳細談一下你的意思嗎?四捨五入$ n * p $在減去之前爲了得到「離散化」的正態分佈? – Alex 2017-07-22 11:46:30

2

scipy.stats模塊中實現的概率分佈允許您通過在構造函數中指定loc關鍵字來任意移動分佈。要獲得平均二項分佈轉移接近0時,您可以撥打

p = stats.binom(N, p, loc=-round(N*p)) 

(請務必使用一個整數值loc與離散分佈。)

下面是一個例子:

p = stats.binom(20, 0.1, loc=-2) 
x = numpy.arange(-3,5) 
bar(x, p.pmf(x)) 

bar plot

編輯:

要生成實際的隨機數,請使用scipy.stats模塊中隨機分佈隨附的rvs()方法。例如:

>>> stats.binom(20,0.1,loc=-2).rvs(10) 
array([-2, 0, 0, 1, 1, 1, -1, 1, 2, 0]) 
+0

我實際上是在尋找符合分佈的隨機數列表,而不僅僅是分佈的樣子。我想我可以從分配中產生數字,但不會感覺乾淨。 – jhoyla 2013-03-24 00:21:54

+0

@jhoyla'scipy.stats'中的每個分發當然都有一個生成隨機數的方法。看我的編輯。你爲什麼覺得它不乾淨? – silvado 2013-03-24 18:43:36