我必须为泊松分布生成数据。我的范围是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;
}
答案 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分布的方法有一些很好的指示。