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/24 15:10:19 UTC
[commons-statistics] branch master updated (9c6b08a -> c4b0a74)
This is an automated email from the ASF dual-hosted git repository.
aherbert pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/commons-statistics.git.
from 9c6b08a Cache mean and variance for the inverse probability implementation
new 9ff8183 Update to use GammaRatio to compute the moments
new 563ec02 Sample Nakagami using a related gamma distribution
new 7cd3813 Javadoc parameter range for mu
new c4b0a74 Increase Exponential PDF test tolerance
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../distribution/NakagamiDistribution.java | 27 +++++++++++++----
.../distribution/ExponentialDistributionTest.java | 2 +-
.../distribution/NakagamiDistributionTest.java | 34 ++++++++++++++++++++++
.../distribution/test.nakagami.1.properties | 4 +--
.../distribution/test.nakagami.2.properties | 4 +--
.../distribution/test.nakagami.3.properties | 4 +--
6 files changed, 62 insertions(+), 13 deletions(-)
[commons-statistics] 02/04: Sample Nakagami using a related gamma distribution
Posted by ah...@apache.org.
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
commit 563ec02e424f7d856683999b6df3096515555560
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Dec 24 14:29:14 2021 +0000
Sample Nakagami using a related gamma distribution
---
.../statistics/distribution/NakagamiDistribution.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
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 77f9b66..3bde611 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
@@ -20,6 +20,9 @@ import org.apache.commons.numbers.gamma.Gamma;
import org.apache.commons.numbers.gamma.GammaRatio;
import org.apache.commons.numbers.gamma.LogGamma;
import org.apache.commons.numbers.gamma.RegularizedGamma;
+import org.apache.commons.rng.UniformRandomProvider;
+import org.apache.commons.rng.sampling.distribution.AhrensDieterMarsagliaTsangGammaSampler;
+import org.apache.commons.rng.sampling.distribution.SharedStateContinuousSampler;
/**
* Implementation of the Nakagami distribution.
@@ -189,4 +192,15 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
public double getSupportUpperBound() {
return SUPPORT_HI;
}
+
+ @Override
+ public Sampler createSampler(UniformRandomProvider rng) {
+ // Generate using a related Gamma distribution
+ // See https://en.wikipedia.org/wiki/Nakagami_distribution#Generation
+ final double shape = mu;
+ final double scale = omega / mu;
+ final SharedStateContinuousSampler sampler =
+ AhrensDieterMarsagliaTsangGammaSampler.of(rng, shape, scale);
+ return () -> Math.sqrt(sampler.sample());
+ }
}
[commons-statistics] 04/04: Increase Exponential PDF test tolerance
Posted by ah...@apache.org.
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
commit c4b0a747adaf13ef152bcfc018fbeddb440fa2dc
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Dec 24 15:08:39 2021 +0000
Increase Exponential PDF test tolerance
The Math.exp function is platform dependent and has lower accuracy than
1 ULP on the given test data depending on the JDK and OS.
---
.../commons/statistics/distribution/ExponentialDistributionTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ExponentialDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ExponentialDistributionTest.java
index a9b8a7e..c52b350 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ExponentialDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/ExponentialDistributionTest.java
@@ -87,7 +87,7 @@ class ExponentialDistributionTest extends BaseContinuousDistributionTest {
final double a = ExponentialDistribution.of(mean).density(x);
// Require high precision.
// This has max error of 3 ulp if using exp(logDensity(x)).
- Assertions.assertEquals(e, a, Math.ulp(e),
+ Assertions.assertEquals(e, a, 2 * Math.ulp(e),
() -> "ULP error: " + expected.subtract(new BigDecimal(a)).doubleValue() / Math.ulp(e));
}
}
[commons-statistics] 03/04: Javadoc parameter range for mu
Posted by ah...@apache.org.
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
commit 7cd381301b4d3d1c23b0bae99719bb9905d6c06f
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Dec 24 14:36:09 2021 +0000
Javadoc parameter range for mu
---
.../commons/statistics/distribution/NakagamiDistribution.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
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 3bde611..6a11c69 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
@@ -59,7 +59,7 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
private final double variance;
/**
- * @param mu Shape parameter.
+ * @param mu Shape parameter (must be positive).
* @param omega Scale parameter (must be positive). Controls the spread of the distribution.
*/
private NakagamiDistribution(double mu,
@@ -76,10 +76,10 @@ public final class NakagamiDistribution extends AbstractContinuousDistribution {
/**
* Creates a Nakagami distribution.
*
- * @param mu Shape parameter.
+ * @param mu Shape parameter (must be positive).
* @param omega Scale parameter (must be positive). Controls the spread of the distribution.
* @return the distribution
- * @throws IllegalArgumentException if {@code mu < 0.5} or if
+ * @throws IllegalArgumentException if {@code mu <= 0} or if
* {@code omega <= 0}.
*/
public static NakagamiDistribution of(double mu,
[commons-statistics] 01/04: Update to use GammaRatio to compute the moments
Posted by ah...@apache.org.
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
commit 9ff818307ba59dcc86e8846cc4d26844791f1991
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Fri Dec 24 14:23:53 2021 +0000
Update to use GammaRatio to compute the moments
Added additional test cases added where the simple computation of
gamma(mu + 0.5) / gamma(mu) will overflow the gamma function.
---
.../distribution/NakagamiDistribution.java | 7 +++--
.../distribution/NakagamiDistributionTest.java | 34 ++++++++++++++++++++++
.../distribution/test.nakagami.1.properties | 4 +--
.../distribution/test.nakagami.2.properties | 4 +--
.../distribution/test.nakagami.3.properties | 4 +--
5 files changed, 44 insertions(+), 9 deletions(-)
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 0075495..77f9b66 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
@@ -17,6 +17,7 @@
package org.apache.commons.statistics.distribution;
import org.apache.commons.numbers.gamma.Gamma;
+import org.apache.commons.numbers.gamma.GammaRatio;
import org.apache.commons.numbers.gamma.LogGamma;
import org.apache.commons.numbers.gamma.RegularizedGamma;
@@ -64,9 +65,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);
+ final double v = GammaRatio.delta(mu, 0.5);
+ mean = Math.sqrt(omega / mu) / v;
+ variance = omega - mean * mean;
}
/**
diff --git a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
index d21b34a..0438773 100644
--- a/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
+++ b/commons-statistics-distribution/src/test/java/org/apache/commons/statistics/distribution/NakagamiDistributionTest.java
@@ -18,6 +18,8 @@ package org.apache.commons.statistics.distribution;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
/**
* Test cases for {@link NakagamiDistribution}.
@@ -53,6 +55,38 @@ class NakagamiDistributionTest extends BaseContinuousDistributionTest {
//-------------------- Additional test cases -------------------------------
+ /**
+ * Test additional moments.
+ * Includes cases where {@code gamma(mu + 0.5) / gamma(mu)} is not computable
+ * directly due to overflow of the gamma function.
+ */
+ @ParameterizedTest
+ @CsvSource({
+ // Generated using matlab
+ "175, 0.75, 0.86540703592357171, 0.0010706621739778321",
+ "175, 1, 0.99928597029814059, 0.0014275495653037762",
+ "175, 1.25, 1.1172356792742391, 0.0017844369566297202",
+ "175, 3.75, 1.9351089605317091, 0.0053533108698891607",
+ "205.25, 0.75, 0.86549814380218737, 0.00091296307496802065",
+ "205.25, 1, 0.99939117261462862, 0.0012172840999573609",
+ "205.25, 1.25, 1.1173532990397681, 0.0015216051249467011",
+ "205.25, 3.75, 1.9353126839415795, 0.0045648153748401032",
+ "305.25, 0.75, 0.865670838787722, 0.00061399887256183283",
+ "305.25, 1.75, 1.32233404855355, 0.0014326640359776099",
+ "305.25, 3.75, 1.9356988416686078, 0.0030699943628091642",
+ "305.25, 12.75, 3.5692523053388152, 0.010437980833551158",
+ "305.25, 25.25, 5.0228805186490098, 0.020671295376248372",
+ })
+ void testAdditionalMoments(double mu, double omega, double mean, double variance) {
+ // Note:
+ // The relative error of the variance is much greater than the mean.
+ // Accuracy of Matlab data requires verification with another source.
+ // Use a moderate threshold.
+ final DoubleTolerance tolerance = DoubleTolerances.relative(2e-10);
+ final NakagamiDistribution dist = NakagamiDistribution.of(mu, omega);
+ testMoments(dist, mean, variance, tolerance);
+ }
+
@Test
void testExtremeLogDensity() {
// XXX: Verify with more test data from a reference distribution
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
index 7cfb3a6..d86c34c 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.1.properties
@@ -15,8 +15,8 @@
parameters = 0.5 1.0
# Computed using matlab
-mean = 0.797884560802866
-variance = 0.363380227632418
+mean = 0.79788456080286552
+variance = 0.3633802276324184
lower = 0
upper = Infinity
cdf.points = 0, 1e-3, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
index eacb7ab..bcb8dd9 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.2.properties
@@ -15,8 +15,8 @@
parameters = 1.5 2.0
# Computed using matlab
-mean = 1.302940031741120
-variance = 0.302347273686450
+mean = 1.3029400317411197
+variance = 0.30234727368644987
lower = 0
upper = Infinity
cdf.points = 0, 1e-3, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2
diff --git a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
index 21d4db9..3506fbc 100644
--- a/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
+++ b/commons-statistics-distribution/src/test/resources/org/apache/commons/statistics/distribution/test.nakagami.3.properties
@@ -15,8 +15,8 @@
parameters = 0.3333333333333333333 1.0
# Computed using matlab
-mean = 0.729810132407137
-variance = 0.467377170635876
+mean = 0.72981013240713744
+variance = 0.46737717063587647
lower = 0
upper = Infinity
cdf.points = 0, 1e-3, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2