【问题标题】:Poisson Distribution in Java (correctness?)Java中的泊松分布(正确性?)
【发布时间】:2014-11-20 17:12:22
【问题描述】:

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

我从来没有统计过,也不知道如何在这里得到正确的曲线。我可以将 lambda 作为 n/2 喂它,但我是否可以将 K 从 0-n 变化?我试过这个(将 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;
}

【问题讨论】:

标签: java curve poisson


【解决方案1】:

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

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

有效数字×底^指数

对于双精度数,11 位用于指数,52 位用于“有效数字”部分。因为浮点数被标准化,第一个正浮点数 > 0.0 的值约为 10^-320(这被定义为 Double.MIN_VALUE 在 Java 中)。请参阅 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 值的泊松分布。

【讨论】:

  • 采用你的符号x = p(L),你是正确的x = p(L/2) + p(L/2)。通过归纳x = sum(from: 1, to: 100, p(L/100) ),但这与100*p(L/100) 不同,因为p(L/100) 的每次评估都会产生不同的结果。方差的基本性质告诉我们,不相关的随机变量之和的方差等于各个方差之和,而常数乘以随机变量的方差是常数平方乘以 RV 的方差。因此,100 * p(L/100) 的方差是 `x = sum(from: 1, to: 100, p(L/100) 的方差的 100 倍。
  • 请参阅en.wikipedia.org/wiki/Variance#Basic_properties 以确认先前评论中引用的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2014-11-22
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多