Use "ChiSquareTest" from "Commons Math" (unit tests).
Project: http://git-wip-us.apache.org/repos/asf/commons-rng/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-rng/commit/ecb27296 Tree: http://git-wip-us.apache.org/repos/asf/commons-rng/tree/ecb27296 Diff: http://git-wip-us.apache.org/repos/asf/commons-rng/diff/ecb27296 Branch: refs/heads/master Commit: ecb27296c13dcdc5d0b624e1be3020e8e2f93e11 Parents: 85b94d9 Author: Gilles <er...@apache.org> Authored: Mon Nov 14 15:21:36 2016 +0100 Committer: Gilles <er...@apache.org> Committed: Mon Nov 14 15:21:36 2016 +0100 ---------------------------------------------------------------------- .../DiscreteSamplerParametricTest.java | 37 ++++---------------- .../distribution/DiscreteSamplersList.java | 8 ++--- 2 files changed, 11 insertions(+), 34 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ecb27296/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplerParametricTest.java ---------------------------------------------------------------------- diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplerParametricTest.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplerParametricTest.java index 6f39d06..3cf6455 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplerParametricTest.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplerParametricTest.java @@ -27,6 +27,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.apache.commons.math3.distribution.ChiSquaredDistribution; +import org.apache.commons.math3.stat.inference.ChiSquareTest; /** * Tests for random deviates generators. @@ -56,9 +57,9 @@ public class DiscreteSamplerParametricTest { final double[] prob = sampler.getProbabilities(); final int len = prob.length; - final long[] expected = new long[len]; + final double[] expected = new double[len]; for (int i = 0; i < len; i++) { - expected[i] = (long) (prob[i] * sampleSize); + expected[i] = prob[i] * sampleSize; } check(sampleSize, sampler.getSampler(), @@ -80,7 +81,8 @@ public class DiscreteSamplerParametricTest { private void check(long sampleSize, DiscreteSampler sampler, int[] points, - long[] expected) { + double[] expected) { + final ChiSquareTest chiSquareTest = new ChiSquareTest(); final int numTests = 50; // Run the tests. @@ -105,10 +107,8 @@ public class DiscreteSamplerParametricTest { } } - // Statistics check. XXX - final double chi2stat = chiSquareStat(expected, observed); - if (chi2stat < 0.001) { - failedStat.add(chi2stat); + if (chiSquareTest.chiSquareTest(expected, observed, 0.001)) { + failedStat.add(chiSquareTest.chiSquareTest(expected, observed)); ++numFailures; } } @@ -123,27 +123,4 @@ public class DiscreteSamplerParametricTest { "chi2=" + Arrays.toString(failedStat.toArray(new Double[0]))); } } - - /** - * @param expected Counts. - * @param observed Counts. - * @return the chi-square statistics. - */ - private static double chiSquareStat(long[] expected, - long[] observed) { - final int numBins = expected.length; - double chi2 = 0; - for (int i = 0; i < numBins; i++) { - final long diff = observed[i] - expected[i]; - chi2 += (diff / (double) expected[i]) * diff; - // System.out.println("bin[" + i + "]" + - // " obs=" + observed[i] + - // " exp=" + expected[i]); - } - - final int dof = numBins - 1; - final ChiSquaredDistribution dist = new ChiSquaredDistribution(null, dof, 1e-8); - - return 1 - dist.cumulativeProbability(chi2); - } } http://git-wip-us.apache.org/repos/asf/commons-rng/blob/ecb27296/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java ---------------------------------------------------------------------- diff --git a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java index e1fa88f..cf3ae99 100644 --- a/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java +++ b/commons-rng-sampling/src/test/java/org/apache/commons/rng/sampling/distribution/DiscreteSamplersList.java @@ -70,22 +70,22 @@ public class DiscreteSamplersList { final int loUniform = -3; final int hiUniform = 4; add(LIST, new org.apache.commons.math3.distribution.UniformIntegerDistribution(loUniform, hiUniform), - MathArrays.sequence(10, -4, 1), + MathArrays.sequence(8, -3, 1), RandomSource.create(RandomSource.SPLIT_MIX_64)); // Uniform. add(LIST, new org.apache.commons.math3.distribution.UniformIntegerDistribution(loUniform, hiUniform), - MathArrays.sequence(10, -4, 1), + MathArrays.sequence(8, -3, 1), new DiscreteUniformSampler(RandomSource.create(RandomSource.MT_64), loUniform, hiUniform)); // Zipf ("inverse method"). final int numElementsZipf = 5; final double exponentZipf = 2.345; add(LIST, new org.apache.commons.math3.distribution.ZipfDistribution(numElementsZipf, exponentZipf), - MathArrays.sequence(5, 0, 1), + MathArrays.sequence(5, 1, 1), RandomSource.create(RandomSource.XOR_SHIFT_1024_S)); // Zipf. add(LIST, new org.apache.commons.math3.distribution.ZipfDistribution(numElementsZipf, exponentZipf), - MathArrays.sequence(7, 0, 1), + MathArrays.sequence(5, 1, 1), new RejectionInversionZipfSampler(RandomSource.create(RandomSource.WELL_19937_C), numElementsZipf, exponentZipf)); // Poisson ("inverse method").