/*
* File: PoissonDistributionTest.java
* Authors: Kevin R. Dixon
* Company: Sandia National Laboratories
* Project: Cognitive Foundry
*
* Copyright Dec 14, 2009, Sandia Corporation.
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
* license for use of this work by or on behalf of the U.S. Government.
* Export of this program may require a license from the United States
* Government. See CopyrightHistory.txt for complete details.
*
*/
package gov.sandia.cognition.statistics.distribution;
import gov.sandia.cognition.collection.CollectionUtil;
import gov.sandia.cognition.collection.IntegerSpan;
import gov.sandia.cognition.math.matrix.Vector;
import gov.sandia.cognition.statistics.ClosedFormIntegerDistributionTestHarness;
import gov.sandia.cognition.util.DefaultWeightedValue;
import gov.sandia.cognition.util.WeightedValue;
import java.util.ArrayList;
/**
* Unit tests for PoissonDistributionTest.
*
* @author krdixon
*/
public class PoissonDistributionTest
extends ClosedFormIntegerDistributionTestHarness
{
/**
* Tests for class PoissonDistributionTest.
* @param testName Name of the test.
*/
public PoissonDistributionTest(
String testName)
{
super(testName);
}
/**
* Test constructors
*/
@Override
public void testDistributionConstructors()
{
System.out.println( "Constructors" );
PoissonDistribution f = new PoissonDistribution();
assertEquals( PoissonDistribution.DEFAULT_RATE, f.getRate() );
double v = RANDOM.nextDouble() * 10.0;
f = new PoissonDistribution( v );
assertEquals( v, f.getRate() );
PoissonDistribution g = new PoissonDistribution( f );
assertNotSame( f, g );
assertEquals( f.getRate(), g.getRate() );
}
/**
* Test PMF constructors
*/
public void testPMFConstructors()
{
System.out.println( "PMF.Constructors" );
PoissonDistribution.PMF f = new PoissonDistribution.PMF();
assertEquals( PoissonDistribution.DEFAULT_RATE, f.getRate() );
double v = RANDOM.nextDouble() * 10.0;
f = new PoissonDistribution.PMF( v );
assertEquals( v, f.getRate() );
PoissonDistribution.PMF g = new PoissonDistribution.PMF( f );
assertNotSame( f, g );
assertEquals( f.getRate(), g.getRate() );
}
/**
* Test CDF constructors
*/
public void testCDFConstructors()
{
System.out.println( "CDF.Constructors" );
PoissonDistribution.CDF f = new PoissonDistribution.CDF();
assertEquals( PoissonDistribution.DEFAULT_RATE, f.getRate() );
double v = RANDOM.nextDouble() * 10.0;
f = new PoissonDistribution.CDF( v );
assertEquals( v, f.getRate() );
PoissonDistribution.CDF g = new PoissonDistribution.CDF( f );
assertNotSame( f, g );
assertEquals( f.getRate(), g.getRate() );
}
/**
* Test of getDomain method, of class PoissonDistribution.
*/
// public void testGetDomain()
// {
// System.out.println("getDomain");
//
// for( int n = 0; n < NUM_SAMPLES; n++ )
// {
// double v = RANDOM.nextDouble() * 10.0;
// PoissonDistribution.PMF instance = new PoissonDistribution.PMF( v );
// Collection<? extends Number> support = instance.getDomain();
// double sum = 0.0;
// for( Number x : support )
// {
// sum += instance.evaluate(x);
// }
// assertEquals( "Failed when rate = " + v, 1.0, sum, TOLERANCE );
// }
//
//
//
// }
/**
* Test of getRate method, of class PoissonDistribution.
*/
public void testGetRate()
{
System.out.println("getRate");
PoissonDistribution instance = this.createInstance();
assertTrue( instance.getRate() > 0.0 );
}
/**
* Test of setRate method, of class PoissonDistribution.
*/
public void testSetRate()
{
System.out.println("setRate");
PoissonDistribution instance = this.createInstance();
assertTrue( instance.getRate() > 0.0 );
double v = RANDOM.nextDouble() * 10.0;
instance.setRate(v);
assertEquals( v, instance.getRate() );
try
{
instance.setRate(0.0);
fail( "Rate must be > 0.0" );
}
catch (Exception e)
{
System.out.println( "Good: " + e );
}
}
@Override
public PoissonDistribution createInstance()
{
return new PoissonDistribution( RANDOM.nextDouble() * 10.0 );
}
@Override
public void testPMFKnownValues()
{
System.out.println( "PMF.knownValues" );
// http://stattrek.com/Tables/Poisson.aspx
PoissonDistribution.PMF f = new PoissonDistribution.PMF( 2.0 );
assertEquals( 0.1804470443, f.evaluate(3.0), TOLERANCE );
assertEquals( 0.135335283236613, f.evaluate(0.0), TOLERANCE );
assertEquals( 0.0, f.evaluate(-1.0) );
f.setRate(10.0);
assertEquals( 0.0189166374010354, f.evaluate(4.0), TOLERANCE );
}
@Override
public void testKnownConvertToVector()
{
System.out.println( "CDF.convertToVector" );
double v = RANDOM.nextDouble()*10.0;
PoissonDistribution.CDF f = new PoissonDistribution.CDF( v );
Vector p = f.convertToVector();
assertEquals( 1, p.getDimensionality() );
assertEquals( v, p.getElement(0) );
}
@Override
public void testCDFKnownValues()
{
System.out.println( "CDF.knownValues" );
// http://stattrek.com/Tables/Poisson.aspx
PoissonDistribution.CDF f = new PoissonDistribution.CDF( 2.0 );
assertEquals( 0.857123460498547, f.evaluate(3.0), TOLERANCE );
assertEquals( 0.135335283236613, f.evaluate(0.0), TOLERANCE );
assertEquals( 0.0, f.evaluate(-1.0) );
f.setRate(10.0);
assertEquals( 0.0292526880769611, f.evaluate(4.0), TOLERANCE );
}
@Override
public void testKnownGetDomain()
{
System.out.println( "Known Domain" );
double rate = Math.abs( RANDOM.nextGaussian() ) + 10;
PoissonDistribution d = new PoissonDistribution( rate );
IntegerSpan domain = d.getDomain();
assertTrue( domain.size() > rate*10 );
assertEquals( 0, CollectionUtil.getFirst(domain).intValue() );
}
@Override
public void testCDFSample_Random_int()
{
// RANDOM = new Random(2);
// super.testCDFSample_Random_int();
}
public void testLearner()
{
PoissonDistribution p1 = new PoissonDistribution(0.25);
ArrayList<Number> data = p1.sample(RANDOM, 100);
PoissonDistribution learned =
new PoissonDistribution.MaximumLikelihoodEstimator().learn(data);
assertEquals(p1.getRate(), learned.getRate(), TOLERANCE);
}
public void testWeightedLearner()
{
PoissonDistribution p1 = new PoissonDistribution(0.25);
ArrayList<WeightedValue<Number>> data = new ArrayList<WeightedValue<Number>>();
for (Number value : p1.sample(RANDOM, 100))
{
data.add(DefaultWeightedValue.create(value,
100.0 + RANDOM.nextDouble()));
}
// Add some noise.
for (int i = 0; i < 5; i++)
{
data.add(DefaultWeightedValue.create((Number)
(RANDOM.nextInt(10) + 1), 0.0001 * RANDOM.nextDouble()));
}
// Add some zeros.
for (int i = 0; i < 10; i++)
{
data.add(DefaultWeightedValue.create((Number)
100, 0.0));
}
PoissonDistribution learned =
new PoissonDistribution.WeightedMaximumLikelihoodEstimator().learn(data);
assertEquals(p1.getMean(), learned.getMean(), 0.001);
}
}