|
Commons Math example source code file (PoissonDistributionTest.java)
The Commons Math PoissonDistributionTest.java source code
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.math.distribution;
import org.apache.commons.math.MathException;
/**
* <code>PoissonDistributionTest
*
* @version $Revision: 924345 $ $Date: 2010-03-17 12:03:56 -0400 (Wed, 17 Mar 2010) $
*/
public class PoissonDistributionTest extends IntegerDistributionAbstractTest {
/**
* Poisson parameter value for the test distribution.
*/
private static final double DEFAULT_TEST_POISSON_PARAMETER = 4.0;
/**
* Constructor.
* @param name
*/
public PoissonDistributionTest(String name) {
super(name);
setTolerance(1e-12);
}
/**
* Creates the default discrete distribution instance to use in tests.
*/
@Override
public IntegerDistribution makeDistribution() {
return new PoissonDistributionImpl(DEFAULT_TEST_POISSON_PARAMETER);
}
/**
* Creates the default probability density test input values.
*/
@Override
public int[] makeDensityTestPoints() {
return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20};
}
/**
* Creates the default probability density test expected values.
* These and all other test values are generated by R, version 1.8.1
*/
@Override
public double[] makeDensityTestValues() {
return new double[] { 0d, 0.0183156388887d, 0.073262555555d,
0.14652511111d, 0.195366814813d, 0.195366814813,
0.156293451851d, 0.00529247667642d, 8.27746364655e-09};
}
/**
* Creates the default cumulative probability density test input values.
*/
@Override
public int[] makeCumulativeTestPoints() {
return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20 };
}
/**
* Creates the default cumulative probability density test expected values.
*/
@Override
public double[] makeCumulativeTestValues() {
return new double[] { 0d, 0.0183156388887d, 0.0915781944437d,
0.238103305554d, 0.433470120367d, 0.62883693518,
0.78513038703d, 0.99716023388d, 0.999999998077 };
}
/**
* Creates the default inverse cumulative probability test input values.
* Increased 3rd and 7th values slightly as computed cumulative
* probabilities for corresponding values exceeds the target value (still
* within tolerance).
*/
@Override
public double[] makeInverseCumulativeTestPoints() {
return new double[] { 0d, 0.018315638889d, 0.0915781944437d,
0.238103305554d, 0.433470120367d, 0.62883693518,
0.78513038704d, 0.99716023388d, 0.999999998077 };
}
/**
* Creates the default inverse cumulative probability density test expected values.
*/
@Override
public int[] makeInverseCumulativeTestValues() {
return new int[] { -1, 0, 1, 2, 3, 4, 5, 10, 20};
}
/**
* Test the normal approximation of the Poisson distribution by
* calculating P(90 ≤ X ≤ 110) for X = Po(100) and
* P(9900 ≤ X ≤ 10200) for X = Po(10000)
*/
public void testNormalApproximateProbability() throws Exception {
PoissonDistribution dist = new PoissonDistributionImpl(100);
double result = dist.normalApproximateProbability(110)
- dist.normalApproximateProbability(89);
assertEquals(0.706281887248, result, 1E-10);
dist.setMean(10000);
result = dist.normalApproximateProbability(10200)
- dist.normalApproximateProbability(9899);
assertEquals(0.820070051552, result, 1E-10);
}
/**
* Test the degenerate cases of a 0.0 and 1.0 inverse cumulative probability.
* @throws Exception
*/
public void testDegenerateInverseCumulativeProbability() throws Exception {
PoissonDistribution dist = new PoissonDistributionImpl(DEFAULT_TEST_POISSON_PARAMETER);
assertEquals(Integer.MAX_VALUE, dist.inverseCumulativeProbability(1.0d));
assertEquals(-1, dist.inverseCumulativeProbability(0d));
}
public void testMean() {
PoissonDistribution dist = new PoissonDistributionImpl(DEFAULT_TEST_POISSON_PARAMETER);
try {
dist.setMean(-1);
fail("negative mean. IllegalArgumentException expected");
} catch(IllegalArgumentException ex) {
}
dist.setMean(10.0);
assertEquals(10.0, dist.getMean(), 0.0);
}
public void testLargeMeanCumulativeProbability() {
PoissonDistribution dist = new PoissonDistributionImpl(1.0);
double mean = 1.0;
while (mean <= 10000000.0) {
dist.setMean(mean);
double x = mean * 2.0;
double dx = x / 10.0;
double p = Double.NaN;
double sigma = Math.sqrt(mean);
while (x >= 0) {
try {
p = dist.cumulativeProbability(x);
assertFalse("NaN cumulative probability returned for mean = " +
mean + " x = " + x,Double.isNaN(p));
if (x > mean - 2 * sigma) {
assertTrue("Zero cum probaility returned for mean = " +
mean + " x = " + x, p > 0);
}
} catch (MathException ex) {
fail("mean of " + mean + " and x of " + x + " caused " + ex.getMessage());
}
x -= dx;
}
mean *= 10.0;
}
}
/**
* JIRA: MATH-282
*/
public void testCumulativeProbabilitySpecial() throws Exception {
PoissonDistribution dist = new PoissonDistributionImpl(1.0);
dist.setMean(9120);
checkProbability(dist, 9075);
checkProbability(dist, 9102);
dist.setMean(5058);
checkProbability(dist, 5044);
dist.setMean(6986);
checkProbability(dist, 6950);
}
private void checkProbability(PoissonDistribution dist, double x) throws Exception {
double p = dist.cumulativeProbability(x);
assertFalse("NaN cumulative probability returned for mean = " +
dist.getMean() + " x = " + x, Double.isNaN(p));
assertTrue("Zero cum probability returned for mean = " +
dist.getMean() + " x = " + x, p > 0);
}
public void testLargeMeanInverseCumulativeProbability() throws Exception {
PoissonDistribution dist = new PoissonDistributionImpl(1.0);
double mean = 1.0;
while (mean <= 100000.0) { // Extended test value: 1E7. Reduced to limit run time.
dist.setMean(mean);
double p = 0.1;
double dp = p;
while (p < .99) {
double ret = Double.NaN;
try {
ret = dist.inverseCumulativeProbability(p);
// Verify that returned value satisties definition
assertTrue(p >= dist.cumulativeProbability(ret));
assertTrue(p < dist.cumulativeProbability(ret + 1));
} catch (MathException ex) {
fail("mean of " + mean + " and p of " + p + " caused " + ex.getMessage());
}
p += dp;
}
mean *= 10.0;
}
}
}
Other Commons Math examples (source code examples)Here is a short list of links related to this Commons Math PoissonDistributionTest.java source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.