Java中的泊松分布(正确性?)

时间:2014-09-25 19:47:43

标签: java curve poisson

我必须为泊松分布生成数据。我的范围是n = 1000到100K。其中n是数据元素的数量; k从1变化到n。它说使用lambda作为n / 2

我从未接受过统计数据,也不知道如何在这里得到正确的曲线。我可以将它作为n / 2喂它lambda,但是我是否从0-n改变K?我尝试了这个(将k作为参数传递),当我绘制数据时,它会上升,而不是鱼尾。我做错了什么,或者我做得对吗?

由于

我在Knuth的java中有这段代码。

static double poissonRandomNumber(int lambda) {
    double L = Math.exp(-lambda);
    int k = 0;
    double p = 1;
    do {
        k = k + 1;
        double u = Math.random();
        p = p * u;
    } while (p > L);
    return k - 1;
}

1 个答案:

答案 0 :(得分:0)

您遇到的一个问题是计算机如何使用floating point numbers表示和执行计算的基本限制。

在计算机上以类似于科学记数法的形式表示实数:

  

有效数字×基数^指数

对于双精度数,指数使用11位,“有效数字”部分使用52位。因为浮点数是标准化,所以第一个正浮点数> 0.0的值大约为10 ^ -320(在Java中定义为 Double.MIN_VALUE )。有关此内容的详细说明,请参阅IEEE Standard 754 Floating Point Numbers

考虑代码行:

double L = Math.exp(-lambda);

如果lambda为1000, e ^ -1000 (大约10 ^ -435)小于 Double.MIN_VALUE ,并且计算机无法以任何方式表示 e ^ -1000 ,只能表示 e ^ -100000

您可以通过注意lambda是“到达率”来解决此问题,并且您可以计算较短间隔的随机样本并对它们求和。那是

x = p(L);

可以计算为

x = p(L/2) + p(L/2);

和更大的数字可以近似:

x = 100 * p(L/100);

Wikipedia article has on the Poisson distribution对于计算大型lambda值的Poisson分布的方法有一些很好的指示。