You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2021/12/21 12:26:34 UTC

[commons-statistics] branch master updated: Cache mean and variance for the inverse probability implementation

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git


The following commit(s) were added to refs/heads/master by this push:
     new 9c6b08a  Cache mean and variance for the inverse probability implementation
9c6b08a is described below

commit 9c6b08a9a9c8ef3541735b6c05b15aee1e78fb5c
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Tue Dec 21 12:26:25 2021 +0000

    Cache mean and variance for the inverse probability implementation
---
 .../statistics/distribution/BetaDistribution.java  | 15 ++++----
 .../statistics/distribution/FDistribution.java     | 40 ++++++++++++----------
 .../statistics/distribution/GammaDistribution.java | 10 ++++--
 .../distribution/NakagamiDistribution.java         | 12 +++++--
 4 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
index cbde35c..8b7b573 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/BetaDistribution.java
@@ -48,6 +48,10 @@ public final class BetaDistribution extends AbstractContinuousDistribution {
     private final double beta;
     /** Normalizing factor used in density computations.*/
     private final double z;
+    /** Cached value for inverse probability function. */
+    private final double mean;
+    /** Cached value for inverse probability function. */
+    private final double variance;
 
     /**
      * @param alpha First shape parameter (must be positive).
@@ -58,6 +62,9 @@ public final class BetaDistribution extends AbstractContinuousDistribution {
         this.alpha = alpha;
         this.beta = beta;
         z = LogGamma.value(alpha) + LogGamma.value(beta) - LogGamma.value(alpha + beta);
+        final double alphabetasum = alpha + beta;
+        mean = alpha / alphabetasum;
+        variance = (alpha * beta) / ((alphabetasum * alphabetasum) * (alphabetasum + 1));
     }
 
     /**
@@ -180,8 +187,7 @@ public final class BetaDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getMean() {
-        final double a = getAlpha();
-        return a / (a + getBeta());
+        return mean;
     }
 
     /**
@@ -193,10 +199,7 @@ public final class BetaDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getVariance() {
-        final double a = getAlpha();
-        final double b = getBeta();
-        final double alphabetasum = a + b;
-        return (a * b) / ((alphabetasum * alphabetasum) * (alphabetasum + 1));
+        return variance;
     }
 
     /**
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
index e1b8ca1..c6de7ba 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/FDistribution.java
@@ -53,6 +53,10 @@ public final class FDistribution extends AbstractContinuousDistribution {
     private final double mhalfLogm;
     /** LogBeta(n/2, n/2) with n = numerator DF. */
     private final double logBetaNhalfNhalf;
+    /** Cached value for inverse probability function. */
+    private final double mean;
+    /** Cached value for inverse probability function. */
+    private final double variance;
 
     /**
      * @param numeratorDegreesOfFreedom Numerator degrees of freedom.
@@ -67,6 +71,22 @@ public final class FDistribution extends AbstractContinuousDistribution {
         nhalfLogn = nhalf * Math.log(numeratorDegreesOfFreedom);
         mhalfLogm = mhalf * Math.log(denominatorDegreesOfFreedom);
         logBetaNhalfNhalf = LogBeta.value(nhalf, mhalf);
+
+        if (denominatorDegreesOfFreedom > MIN_DENOMINATOR_DF_FOR_MEAN) {
+            mean = denominatorDegreesOfFreedom / (denominatorDegreesOfFreedom - 2);
+        } else {
+            mean = Double.NaN;
+        }
+        if (denominatorDegreesOfFreedom > MIN_DENOMINATOR_DF_FOR_VARIANCE) {
+            final double denomDFMinusTwo = denominatorDegreesOfFreedom - 2;
+
+            variance = (2 * (denominatorDegreesOfFreedom * denominatorDegreesOfFreedom) *
+                            (numeratorDegreesOfFreedom + denominatorDegreesOfFreedom - 2)) /
+                       (numeratorDegreesOfFreedom * (denomDFMinusTwo * denomDFMinusTwo) *
+                            (denominatorDegreesOfFreedom - 4));
+        } else {
+            variance = Double.NaN;
+        }
     }
 
     /**
@@ -218,13 +238,7 @@ public final class FDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getMean() {
-        final double denominatorDF = getDenominatorDegreesOfFreedom();
-
-        if (denominatorDF > MIN_DENOMINATOR_DF_FOR_MEAN) {
-            return denominatorDF / (denominatorDF - 2);
-        }
-
-        return Double.NaN;
+        return mean;
     }
 
     /**
@@ -244,17 +258,7 @@ public final class FDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getVariance() {
-        final double denominatorDF = getDenominatorDegreesOfFreedom();
-
-        if (denominatorDF > MIN_DENOMINATOR_DF_FOR_VARIANCE) {
-            final double numeratorDF = getNumeratorDegreesOfFreedom();
-            final double denomDFMinusTwo = denominatorDF - 2;
-
-            return (2 * (denominatorDF * denominatorDF) * (numeratorDF + denominatorDF - 2)) /
-                   (numeratorDF * (denomDFMinusTwo * denomDFMinusTwo) * (denominatorDF - 4));
-        }
-
-        return Double.NaN;
+        return variance;
     }
 
     /**
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
index b1c173a..13cec75 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/GammaDistribution.java
@@ -46,6 +46,10 @@ public final class GammaDistribution extends AbstractContinuousDistribution {
     private final double scale;
     /** Precomputed term for the log density: {@code -log(gamma(shape)) - log(scale)}. */
     private final double minusLogGammaShapeMinusLogScale;
+    /** Cached value for inverse probability function. */
+    private final double mean;
+    /** Cached value for inverse probability function. */
+    private final double variance;
 
     /**
      * @param shape Shape parameter.
@@ -56,6 +60,8 @@ public final class GammaDistribution extends AbstractContinuousDistribution {
         this.shape = shape;
         this.scale = scale;
         this.minusLogGammaShapeMinusLogScale = -LogGamma.value(shape) - Math.log(scale);
+        mean = shape * scale;
+        variance = shape * scale * scale;
     }
 
     /**
@@ -197,7 +203,7 @@ public final class GammaDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getMean() {
-        return shape * scale;
+        return mean;
     }
 
     /**
@@ -208,7 +214,7 @@ public final class GammaDistribution extends AbstractContinuousDistribution {
      */
     @Override
     public double getVariance() {
-        return shape * scale * scale;
+        return variance;
     }
 
     /**
diff --git a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
index b1209eb..0075495 100644
--- a/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
+++ b/commons-statistics-distribution/src/main/java/org/apache/commons/statistics/distribution/NakagamiDistribution.java
@@ -49,6 +49,10 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
     private final double densityPrefactor;
     /** Log density prefactor. */
     private final double logDensityPrefactor;
+    /** Cached value for inverse probability function. */
+    private final double mean;
+    /** Cached value for inverse probability function. */
+    private final double variance;
 
     /**
      * @param mu Shape parameter.
@@ -60,6 +64,9 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
         this.omega = omega;
         densityPrefactor = 2.0 * Math.pow(mu, mu) / (Gamma.value(mu) * Math.pow(omega, mu));
         logDensityPrefactor = LN_2 + Math.log(mu) * mu - LogGamma.value(mu) - Math.log(omega) * mu;
+        mean = Gamma.value(mu + 0.5) / Gamma.value(mu) * Math.sqrt(omega / mu);
+        final double v = Gamma.value(mu + 0.5) / Gamma.value(mu);
+        variance = omega * (1 - 1 / mu * v * v);
     }
 
     /**
@@ -149,14 +156,13 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
     /** {@inheritDoc} */
     @Override
     public double getMean() {
-        return Gamma.value(mu + 0.5) / Gamma.value(mu) * Math.sqrt(omega / mu);
+        return mean;
     }
 
     /** {@inheritDoc} */
     @Override
     public double getVariance() {
-        final double v = Gamma.value(mu + 0.5) / Gamma.value(mu);
-        return omega * (1 - 1 / mu * v * v);
+        return variance;
     }
 
     /**