random.expovariate(rate)和numpy.random.poisson(quantity)产生相同的平均值,但分布差别很大。为什么是这样?

问题描述 投票:1回答:1

我正在对我们在整个公司使用的负载测试框架进行一些修改,这是一个我很想得到答案的问题。

我的印象是,以下两种产生泊松分布的方法是等价的,但我显然是错的:

#!/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 std_deviation以log base 10(count)的速率进行缩放?

跟进问题:如果您模拟用户与您的服务互动的频率,哪一个更合适?

python numpy statistics distribution poisson
1个回答
4
投票

因为你的假设是错误的。泊松分布的均值/方差都是lambda,因此stdevsqrt(lambda)。指数分布的均值/方差分别为1/lambda1/lambda^2。所以std = sqrt(1/(1/rate)^2) = sqrt(rate^2) = rate正是你在这里看到的。

我建议您阅读关于queuing theory的维基百科文章,以了解您的后续问题。

© www.soinside.com 2019 - 2024. All rights reserved.