2010-11-09 46 views
1

我有一個簡單的腳本,通過構造概率= 0.1的「事件」數組,然後計算每組10個成功的數量來設置泊松分佈。它幾乎可以工作,但分佈不太正確(P(0)應該等於P(1),但是代替P(1)的約90%)。這就像是一種錯誤,但我無法弄清楚它是什麼。該腳本使用來自here的Counter類(因爲我有Python 2.6而不是2.7),並且分組使用itertools,如here所述。這不是一個隨機問題,重複的結果非常嚴格,整體意義看起來不錯,團隊規模看起來不錯。任何想法,我已經搞砸了?泊松模擬不能按預期工作?

from itertools import izip_longest 
import numpy as np 
import Counter 

def groups(iterable, n=3, padvalue=0): 
    "groups('abcde', 3, 'x') --> ('a','b','c'), ('d','e','x')" 
    return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue) 

def event(): 
    f = 0.1 
    r = np.random.random() 
    if r < f: return 1 
    return 0 

L = [event() for i in range(100000)] 
rL = [sum(g) for g in groups(L,n=10)] 
print len(rL) 
print sum(list(L)) 

C = Counter.Counter(rL) 
for i in range(max(C.keys())+1): 
    print str(i).rjust(2), C[i] 

$ python script.py 
10000 
9949 
0 3509 
1 3845 
2 1971 
3 555 
4 104 
5 15 
6 1 
$ python script.py 
10000 
10152 
0 3417 
1 3879 
2 1978 
3 599 
4 115 
5 12 
+0

你不必在這裏泊松分佈,只是一個近似值到一個。你計算一個(伯努利?)分佈,n = 10,p = 0.1。當p變爲0時,保持np = 1,你會得到一個泊松分佈。我建議嘗試stats.stackexchange.com看看這種分佈是否合理。 – 2010-11-09 17:01:57

+0

我+1你堆棧溢出的數學。 – 2010-11-09 17:23:43

+0

<重擊自我>聽起來是對的。愚蠢的錯誤。 – telliott99 2010-11-09 17:50:30

回答

1

我對你的數學做了組合現實檢查,看起來你的結果實際上是正確的。 P(0)不應該大致相當於P(1)

.9^10 = 0.34867844 = probability of 0 events 
.1 * .9^9 * (10 choose 1) = .1 * .9^9 * 10 = 0.387420489 = probability of 1 event 

我不知道如果你不小心做你的數學正是如此:

.1 * .9^10 * (10 choose 1) = 0.34867844 = incorrect probability of 1 event