2014-09-25 143 views
1

我必须为泊松分布生成数据。我的范围是n = 1000到100K。其中n是数据元素的数量; k从1到n不等。它说使用lambda作为n/2Java中的泊松分布(正确性?)

我从来没有拿过统计数据,也不知道如何在这里得到正确的曲线。我可以喂它lambda为n/2,但我是否从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

您需要知道什么函数为泊松分布开始:http://en.wikipedia.org/wiki/Poisson_distribution。如果您可以使用库,请尝试Apache Commons Math:https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/distribution/PoissonDistribution.html – duffymo 2014-09-25 19:50:19

+0

该函数的给定为f (K,λ)= Pr(k)=λ^ ke^lambda/k! e =自然对数2.71 ...我不知道该怎么做,我不知道我在这里做什么。我试图插入图片中的forumla,并没有采取。 – 2014-09-25 20:03:23

+1

这与我发布的链接一致。 – duffymo 2014-09-25 20:05:05

回答

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); 

随着1000的λ,E 1 -1000(大约是10^-435)小于Double.MIN_VALUE,和没有办法的计算机可以代表E 1 -1000任何不同于它可以代表E 1 -100000

你可以解决这个问题注意到lambda是一个“到达率”,你可以计算出更短间隔的随机样本并对它们进行求和。也就是说

x = p(L); 

可以计算为

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

和较大的数字可以近似:

x = 100 * p(L/100); 

Wikipedia article has on the Poisson distribution有一些很好的指针的方式来计算的较大值泊松分布拉姆达。