java - 在 Java 中使用正态逼近的泊松分布

标签 java statistics probability normal-distribution poisson

如果您不确定“使用正态近似的泊松分布”的含义,请点击此链接并检查黄色框中的文本。 https://onlinecourses.science.psu.edu/stat414/node/180

这里是链接中数学的简单快照。

P(Y≥9) = P(Y>8.5) = P(Z>(8.5−6.5)/√6.5) = P(Z>0.78)= 0.218

因此,为了获得 0.218 中的值,我们使用辛普森积分规则 集成了来自“负数”的函数(在下面代码中名为“f”的方法中实现) 无穷大”到等于这个值>>“((8.5−6.5)/√6.5))”

R 成功给出了正确的输出。但是在Java中,当我实现代码时 以下复制自“http://introcs.cs.princeton.edu/java/93integration/SimpsonsRule.java.html” 我得到“0.28360853976343986”,本应是“.218”,这是因为我使用的负无穷大值,即“Double.MIN_VALUE

这是Java代码。 请参阅主方法中我的输入的最后

       * Standard normal distribution density function.
       * Replace with any sufficiently smooth function.
       **********************************************************************/
       public static double f(double x) {
          return Math.exp(- x * x / 2) / Math.sqrt(2 * Math.PI);
       }

      /**********************************************************************
       * Integrate f from a to b using Simpson's rule.
       * Increase N for more precision.
       **********************************************************************/
       public static double integrate(double a, double b) {
          int N = 10000;                    // precision parameter
          double h = (b - a) / (N - 1);     // step size

          // 1/3 terms
          double sum = 1.0 / 3.0 * (f(a) + f(b));

          // 4/3 terms
          for (int i = 1; i < N - 1; i += 2) {
             double x = a + h * i;
             sum += 4.0 / 3.0 * f(x);
          }

          // 2/3 terms
          for (int i = 2; i < N - 1; i += 2) {
             double x = a + h * i;
             sum += 2.0 / 3.0 * f(x);
          }

          return sum * h;
       }



       // sample client program
       public static void main(String[] args) { 
           double z = (8.5-6.5)/Math.sqrt(6.5);
           double a = Double.MIN_VALUE;
           double b =  z;
           System.out.println(integrate(a, b));
      }

有人有什么想法吗?我尝试使用 Apache math 的“PoissonDistribution”类的方法“normalApproximateProbability(int x)”。但问题是这个方法需要一个“int”。

任何人对如何获得正确的输出或任何其他代码有更好的想法。我也为 simpson 使用了另一个库,但得到了相同的输出。

我需要在Java 中完成此操作。

最佳答案

我尝试通过编写另一种实现辛普森 3/8 规则而不是积分函数的方法来测试代码。它给出的结果与您第一次获得的结果相同。所以我认为差异很可能是由舍入误差引起的。

关于java - 在 Java 中使用正态逼近的泊松分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33070380/

相关文章:

javascript - 将数学公式翻译为 JavaScript

python - 正态分布概率密度可以大于 1 吗?...基于 python 代码检查

java - Primefaces 3.4 dataexporter 不导出值 p :cellEditor

java - 当我从 Oracle DB 读取并将检索到的数字存储在字符串中时,为什么值存在差异。

r - 如何用 R 找到回归线上的最低值和最高值?

algorithm - 加权游戏结果的公式/算法

Java - 使用参数写入、读取和修改字符串

java - 如何在 Java 中生成 RSA key

r - 如何在绘图中显示参数

machine-learning - scikit-learn GradientBoostingClassifier 中变量的惩罚?