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;
}
/**