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

标签 java curve poisson

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

我从未进行过统计,也不知道如何在这里获得正确的曲线。我可以将 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;
}

最佳答案

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

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

Significant digits × base^exponent

对于 double ,有 11 位用于指数,52 位用于“有效数字”部分。由于 float 已标准化,因此第一个 > 0.0 的正 float 的值约为 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 值的泊松分布。

关于java - Java 中的泊松分布(正确性?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26046889/

相关文章:

java - 未在构建项目中导出映射器文件 (*.xml)。使用mybatis

OpenGL将光线距离与深度缓冲区进行比较

html - 圆形曲线的剪辑路径选项?

r - 使用 bam 的零膨胀模型 (ziP) 中的错误

JavaFX 列/单元格值未更新

java - 静态元模型主键属性未填充(NullPointerException)

java - 从直线嵌套抛物线

matlab - 在 Matlab 中根据所需支持截断泊松分布

r - R 中泊松回归的预测不准确

java - 如何在没有参数和参数的方法之间传递变量