泊松模拟未按预期工作?
我有一个简单的脚本,用来设置一个泊松分布。这个脚本通过构建一个概率为0.1的“事件”数组,然后统计每10个事件中的成功次数。它几乎能正常工作,但分布有点问题(P(0)应该等于P(1),但实际上P(0)大约是P(1)的90%)。这就像是出现了一个“错位”的错误,但我搞不清楚具体是什么。这个脚本使用了来自这里的Counter类(因为我用的是Python 2.6,而不是2.7),分组则使用了itertools,具体讨论可以参考这里。这不是随机性的问题,重复实验的结果相当稳定,整体均值看起来也不错,分组大小也合适。你们觉得我哪里搞错了呢?
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
1 个回答
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