random.expovariate(rate)和numpy.random.poisson(quantity)的平均值相同,但分布大相径庭,为什么?
我正在对我们公司使用的负载测试框架进行一些修改,这里有个问题我很想知道答案。
我原以为下面这两种生成泊松分布的方法是等价的,但显然我错了:
#!/usr/bin/env python
from numpy import average, random, std
from random import expovariate
def main():
for count in 5.0, 50.0:
data = [random.poisson(count) for i in range(10000)]
print 'npy_poisson average with count=%d: ' % count, average(data)
print 'npy_poisson std_dev with count=%d: ' % count, std(data)
rate = 1 / count
data = [expovariate(rate) for i in range(10000)]
print 'expovariate average with count=%d: ' % count, average(data)
print 'expovariate std_dev with count=%d: ' % count, std(data)
if __name__ == '__main__':
main()
这导致的输出看起来像:
npy_poisson average with count=5: 5.0168
npy_poisson std_dev with count=5: 2.23685443424
expovariate average with count=5: 4.94383067075
expovariate std_dev with count=5: 4.95058985422
npy_poisson average with count=50: 49.9584
npy_poisson std_dev with count=50: 7.07829565927
expovariate average with count=50: 50.9617389096
expovariate std_dev with count=50: 51.6823970228
为什么当我使用内置的 random.expovariate 时,标准差会随着给定时间段内事件数量的增加而成比例变化,而 expovariate 的标准差却是以 10 为底的对数(count)来变化的呢?
后续问题:如果你是在模拟用户与服务互动的频率,哪种方法更合适呢?
1 个回答
4
因为你的假设是错误的。泊松分布的平均值和方差都是 lambda
,所以标准差 stdev
是 sqrt(lambda)
。而指数分布的平均值和方差分别是 1/lambda
和 1/lambda^2
。所以标准差的计算是 std = sqrt(1/(1/rate)^2) = sqrt(rate^2) = rate
,这正是你在这里看到的结果。
我建议你去看看维基百科上关于 排队理论的文章,可能对你后续的问题有帮助。